Search code examples
phpajaxshellbackground-processshell-exec

PHP passing parameters to a background script


I've been looking for quite a while on internet, but I cannot find a solution to my problem. I am pretty new to PHP, and I am having issues to run a php script in background.

Basically, I am getting POST data from JQuery ajax, I put it in a long string using escapeshellarg() on each variable and separated by spaces, and I call the script I want to process in background with exec() or shell_exec() functions (I tried both without any success...).

$arg_list  = escapeshellarg($str_solution)." ";
$arg_list .= escapeshellarg($str_rubriques)." ";
$arg_list .= escapeshellarg($intervalle)." ";
$arg_list .= escapeshellarg($date_start)." ";
$arg_list .= escapeshellarg($date_end)." ";
$arg_list .= escapeshellarg($_SESSION['user_id'])." ";
$arg_list .= escapeshellarg($_SESSION['user_name']);

//BACKGROUND EXECUTION
$output = shell_exec("/opt/plesk/php/5.6/bin/php-cgi -q script_rapports_intervalle.php ".$arg_list." &");
print_r($output);

On the script_rapports_intervalle.php file, I just do :

print_r($argv);
print_r("here i am");
die;

//HERE GOES THE SCRIPT
//....

I do got a response from this script, as it displays only the "here i am" string. When I use a var_dump() on $argv, it says it is NULL. I have also tried to pass simple arguments like "foo" and "bar", but it seems that $argv is always equal to NULL.

Moreover, I saw many usages for processing a background script: putting "&" at the end of the command, or putting "| at now" instead. Which one should I use?

I guess I am surely doing things the wrong way, but I still cannot see where to fix the issues.


Solution

  • For me this simple code works

      $params = array("function_name" => 'image_detect',"image_guid" => $image_guid);
    
      $query_string = http_build_query($params, "", " ");
     if (PHP_OS === "WINNT") {
        pclose(popen("start /B php " . $script_location . " " . $query_string, "r"));
     } else {
        exec("/opt/plesk/php/5.6/bin/php " . $script_location . " " . $query_string . " &> /dev/null &");
     }
    

    So in your case you can check by replacing /opt/plesk/php/5.6/bin/php-cgi with /opt/plesk/php/5.6/bin/php