PHP выполняет внешний скрипт без ожидания при передаче переменных - PullRequest
3 голосов
/ 17 июля 2011

Я делаю функцию для своих пользователей, где они могут загружать большие файлы XML для синхронизации с моей базой данных.

Когда пользователь загружает файл в upload.php, я хочу начать обработку данных вфон с process.php, предпочтительно из команды оболочки, и перенаправить пользователя на status.php, который показывает процесс синхронизации.

Мне нужно передать некоторые переменные в сценарий process.php при выполненииэто, по крайней мере, одна переменная с идентификатором пользователя и помещение других переменных в текстовый файл (вероятно, я бы предпочел это, поэтому мне не нужно вводить много данных в команду exec().) или идентификатор пользователя и кучаиз $_POST переменных.

Одним из решений, которое я имел в виду , является выполнение сценария PHP следующим образом:

exec("php -f ./process.php > /dev/null 2>/dev/null &"); 

Это позволяет мне заблокировать process.phpиз http доступа, что хорошо, так как это процесс, принимающий скрипт.Единственное, что мне здесь нужно, это как-то передать переменную, но я не знаю, как это сделать.

Поэтому мой главный вопрос:

Как передать переменную вРешение выше?

Или у кого-нибудь из вас есть лучшее решение для этого?Возможно, один, где мне не придется проходить exec()?Помните, что я не хочу, чтобы пользователь ждал выполнения скрипта, и мне нужно передать хотя бы одну переменную.

Обновление: Для дальнейшего использования не забудьте использовать escapeshellarg () при передаче аргументов через exec() или аналогичные функции.

Ответы [ 4 ]

4 голосов
/ 17 июля 2011

Вы тестируете его

exec("php -f ./process.php var1 var2 > /dev/null 2>/dev/null &"); 

И если вы хотите получить эти переменные, значения могут быть доступны с глобальной переменной $ argv. Если вы распечатываете это вар шоу, то же самое:

print_r($argv);


Array
(
    [0] => process.php
    [1] => var1
    [2] => var2
)
2 голосов
/ 17 июля 2011

Вы можете передавать параметры следующим образом.

// call process.php
exec("php -f ./process.php foo=bar bar=foo > /dev/null 2>/dev/null &"); 

// process.php
if ($argc > 0) {
    for ($i=1;$i < $argc;$i++) {
        parse_str($argv[$i],$tmp);
        $_REQUEST = array_merge($_REQUEST, $tmp);
    }
}

var_dump($_REQUEST);
1 голос
/ 14 августа 2012

Вот мое решение.

Преимущество заключается в том, что вы можете использовать этот скрипт как для командной строки, так и для регулярного использования в Интернете.В случае, если вы вызываете ее из cmd, переменная $argv установлена, поэтому часть parse_str() извлекает переменные и помещает их в массив $ _GET.В случае, если вы вызываете его из Интернета, $argv не установлен, поэтому значения поступают из URL.

// executingScript.php
// You have to make percent escaping yourself
exec("php -f ./executedScript.php foo=bar%20foo bar=foo%20bar > /dev/null 2>/dev/null &");

// executedScript.php
// The if-statement avoids crashing when calling the script from the web
if (isset($argv)) {
    parse_str(implode('&', array_slice($argv, 1)), $_GET);
}

Это позволит вам получить доступ к переменным, как обычно:

echo $_GET["foo"] // outputs "bar foo"
echo $_GET["bar"] // outputs "foo bar"
1 голос
/ 17 июля 2011

Я не совсем понял вашу цель, но передача аргумента PHP-скрипту работает аналогично любым другим сценариям оболочки.См .: http://www.php.net/manual/en/features.commandline.usage.php (Пример №2)

«Когда пользователь загружает файл […], я хочу начать обработку данных в фоновом режиме» - Вы не можете получить доступзагрузка до ее завершения , в PHP с использованием CGI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...