有时我有一个很长的任务,我不希望当前的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
答案 0 :(得分:1)
您可以通过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
答案 1 :(得分:1)
如果目标是将状态返回给客户端并继续处理,您可能会发现更容易做类似的事情。
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命令而不是简单地将其作为子项运行当前线程的过程。