【问题标题】:PHP passing parameters to a background scriptPHP将参数传递给后台脚本
【发布时间】:2016-07-12 15:32:46
【问题描述】:

我已经在互联网上寻找了很长一段时间,但我找不到解决问题的方法。我对 PHP 很陌生,在后台运行 php 脚本时遇到问题。

基本上,我从 JQuery ajax 获取 POST 数据,我在每个变量上使用 escapeshellarg() 将它放在一个长字符串中,并用空格分隔,然后我用 exec() 或 shell_exec 调用我想在后台处理的脚本() 函数(我都尝试过,但都没有成功...)。

$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);

在 script_rapports_intervalle.php 文件中,我只是这样做:

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

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

我确实收到了这个脚本的响应,因为它只显示“我在这里”字符串。当我在 $argv 上使用 var_dump() 时,它说它是 NULL。我也尝试过传递简单的参数,如“foo”和“bar”,但似乎 $argv 总是等于 NULL。

此外,我看到了处理后台脚本的许多用法:将“&”放在命令末尾,或者将“| at now”代替。我应该使用哪一个?

我想我肯定做错了事,但我仍然看不到在哪里解决问题。

【问题讨论】:

    标签: php ajax shell background-process shell-exec


    【解决方案1】:

    对我来说,这个简单的代码有效

      $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 &");
     }
    

    因此,在您的情况下,您可以通过将 /opt/plesk/php/5.6/bin/php-cgi 替换为 /opt/plesk/php/5.6/bin/php

    来检查

    【讨论】:

    • 是的,它奏效了。事实上,我调用了错误的 php 二进制文件。我只是按照你的建议用 php 替换了我的 php-cgi(我无法使用 $argc 和 $argv)。谢谢
    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 2011-04-07
    • 2015-05-19
    • 1970-01-01
    • 2012-03-15
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多