将数据发送到 php 后台线程脚本

send data to php background thread script

有时我有一个很长的任务,我不想让当前的 PHP 线程等待,我做了类似下面的事情。在会话中传递数据有点笨拙,但似乎可行。

我有另一个类似的应用程序,除了 file1.php 不是被用户的客户端访问,而是被另一台服务器访问,而用户只访问另一台服务器。因此,file1.php 中的 session_start() 将无法使用会话 cookie,并且必须为每次出现创建一个单独的会话文件。

还有哪些其他选项可以将数据传递到后台工作脚本?我没有传递大量数据,但它仍然是 1kb 左右。

file1.php

session_start();
$_SESSION['_xfr']=$_POST;
$status=exec($'/usr/bin/php -q /path/to/my/worker.php'.' '.session_id().' >/dev/null &');
echo('Tell client we are done.');

file2.php

session_id($argv[1]);//Set by parent
session_start();
$data=$_SESSION['_xfr'];
//Do some task

您可以通过 args 发送数据,如 json:

file1.php

$status=exec($'/usr/bin/php -q /path/to/my/worker.php'.' '.json_encode($_POST).' >/dev/null &');
echo('Tell client we are done.');

file2.php

$data=json_decode($argv[1]);
//Do some task

如果目标是 return 给客户端一个状态并继续处理,您可能会发现简单地做类似的事情会更容易。

public function closeConnection($body, $responseCode){
    // Cause we are clever and don't want the rest of the script to be bound by a timeout.
    // Set to zero so no time limit is imposed from here on out.
    set_time_limit(0);

    // Client disconnect should NOT abort our script execution
    ignore_user_abort(true);

    // Clean (erase) the output buffer and turn off output buffering
    // in case there was anything up in there to begin with.
    ob_end_clean();

    // Turn on output buffering, because ... we just turned it off ...
    // if it was on.
    ob_start();

    echo $body;

    // Return the length of the output buffer
    $size = ob_get_length();

    // send headers to tell the browser to close the connection
    // remember, the headers must be called prior to any actual
    // input being sent via our flush(es) below.
    header("Connection: close\r\n");
    header("Content-Encoding: none\r\n");
    header("Content-Length: $size");

    // Set the HTTP response code
    // this is only available in PHP 5.4.0 or greater
    http_response_code($responseCode);

    // Flush (send) the output buffer and turn off output buffering
    ob_end_flush();

    // Flush (send) the output buffer
    // This looks like overkill, but trust me. I know, you really don't need this
    // unless you do need it, in which case, you will be glad you had it!
    @ob_flush();

    // Flush system output buffer
    // I know, more over kill looking stuff, but this
    // Flushes the system write buffers of PHP and whatever backend PHP is using
    // (CGI, a web server, etc). This attempts to push current output all the way
    // to the browser with a few caveats.
    flush();
}

否则,您的选项仅限于 HTTP 服务器中的多线程,并且在您以另一种方式执行时通过 exec 进行炮击……但是,您可能想要 nohup 命令而不是简单地 运行 它作为当前线程的子进程。