передача переменных URL в exec () с помощью php - PullRequest
1 голос
/ 27 июля 2010

У меня есть выделенный сервер, который я использую для обработки большого количества данных.Теперь я могу открыть сценарий с идентификатором процесса, например example.php?ex_pid=123, и просто отпустить его.Он загружает небольшую часть данных, обрабатывает их, затем загружает их в базу данных, затем снова запускает.

В идеале, я хотел бы вызвать example.php?ex_pid=123 напрямую, а не путем передачи переменной в example.php, например exec('./example.php'.' '.EscapeShellArg($variable)); чтобы он не действовал глобально.

Меня не волнует вывод, если он может выполняться в фоновом режиме, это было бы блестяще.Кстати, это дистрибутив Ubuntu.

Возможно ли это?Если так, любая помощь и примеры будут более чем признательны.

Ответы [ 4 ]

1 голос
/ 10 августа 2010

Вы можете сделать что-то вроде:

exec("./example.php '".addslashes(serialize($_GET))."');

А затем в example.php сделайте что-то вроде этого:

count($_GET) == 0 && $_GET = unserialize(stripslashes($_SERVER['argv'][1]))
0 голосов
/ 12 апреля 2011

Я полностью забыл об этом вопросе, пока @Andrew Waugh не прокомментировал его (и я не получил напоминание по электронной почте).

В любом случае, этот вопрос возник из-за неправильного понимания того, как массив $ argv сообщается сценарию при использовании CLI.Вы можете использовать столько аргументов, сколько вам нужно.То, как я это делаю сейчас, выглядит так:

if (isset($argv)) {
    switch ($argv[1]) {
        case "a_distinguishing_name_goes_here":
            $pid = $argv[2];
            sample_function($pid);
            break;
        case "another_name_goes_here":
            do_something_else($argv[2]);
            break;
    }
}
0 голосов
/ 11 апреля 2011

У меня была настоящая проблема с этим, и я не мог заставить его работать что-то вроде example.php? Variable = 1.

Однако я мог бы запустить отдельный файл с помощью команды exec без? Variable = 1 в конце.

Я решил динамически изменять содержимое файла шаблона в зависимости от переменных, которые я хотел отправить. Этот файл называется template.php и содержит весь код, который вы обычно запускаете как $ _GET. Вместо использования $ _GET установите значение переменной прямо вверху. Эта строка кода затем ищется и заменяется любым значением, которое вы выберете.

Затем я сохранил этот новый файл и запустил его.

В следующем примере мне нужно было изменить запрос SQL - в файле шаблона есть строка $ sql = "ENTER SQL CODE HERE" ;. Мне также нужно было изменить значение переменной в верхней части. Строка в template.php: $ myvar = 999999; Код ниже меняет эти строки в template.php на новые значения.

//Get the base file to modify - template.php
$contents=file_get_contents("template.php");
$sql="SELECT * FROM mytable WHERE foo='".$bar."'";

$contents=str_replace("ENTER SQL CODE HERE",$sql,$contents);
//Another search
$contents=str_replace("999999",$bar,$contents);

$filename="run_standalone_code".$bar.".php";

//If the file doesnt't exist, create it
if(!file_exists($filename)){
file_put_contents($filename, $contents);
}

//Now run this file
$cmd="/usr/local/bin/php ".$filename." >/dev/null &";
exec($cmd);
0 голосов
/ 27 июля 2010

Основная проблема в том, что? Ex_pid - это GET-данные, которые обычно связаны либо с включением файла, либо с доступом к нему через браузер.Если бы вы включали файл или обращались к нему через веб-браузер, это было бы тривиально, но, запустив его как CLI, единственным вариантом было бы, к сожалению, передать его в качестве аргумента.Вы можете передать его как ex_pid = 123 и просто проанализировать эти данные, но все равно его нужно будет передать в качестве аргумента, но для этого вы можете использовать parse_str () для анализа.В зависимости от того, что делает скрипт, вы можете вызвать lynx для вызова реальной страницы с прикрепленными данными get и сгенерировать хеш для apikey, необходимого для его запуска.Не уверен, что это вариант, но это еще один способ сделать это, как вы хотите.

Надеюсь, это поможет!

...