我正在使用PHP构建WebService:
基本上,
问题在于php以异步方式运行一些外部代码。
这可能吗?还有另一种方法吗?用shell_exec?
拜托,我需要见解!优雅的方式更可取。
谢谢!
答案 0 :(得分:2)
最好的方法是使用像RabbitMQ这样的消息队列,甚至是简单的MySQL表。
每次在前端控制器中添加新任务时,它都会进入队列。然后由cron job运行的update.php从队列中获取,处理,保存结果并将任务标记为已完成。
此外,它还可以帮助您随着时间的推移分配负载,防止由您自己的脚本导致的DoS。
答案 1 :(得分:1)
您可以使用PHP构建服务。
或者使用bash:system("php myScript.php param param2 &")
答案 2 :(得分:1)
您可以让用户连接到update.php,生成某种唯一ID以跟踪进程,然后使用特殊的GET变量调用fsockopen()
,以表示它正在进行繁重的工作而不是用户互动。立即关闭该连接,然后向用户打印出相应的响应。
同时,查找您指定的特殊GET变量,并在出现时调用ignore_user_abort()
并继续执行if
子句的该分支中所需的任何操作。所以这里是你的update.php文件的粗略框架:
<?php
if ( isset($_GET['asynch']) ) {
ignore_user_abort();
// check for $_GET['id'] and validate,
// then execute long-running code here
} else {
// generate $id here
$host = $_SERVER['SERVER_NAME'];
$url = "/update.php?asynch&id={$id}";
if ( $handle = fsockopen($host, 80, $n, $s, 5) ) {
$data = "GET {$url} HTTP/1.0\r\nHost: {$host}\r\n\r\n";
fwrite($handle, $data);
fclose($handle);
}
// return a response to the user
echo 'Response goes here';
}
?>
答案 3 :(得分:0)
使用Redis resque或gearman
查看工作进程