异步运行外部php代码
我正在使用PHP构建一个Web服务: 基本上异步运行外部php代码,php,multithreading,web-services,asynchronous,fork,Php,Multithreading,Web Services,Asynchronous,Fork,我正在使用PHP构建一个Web服务: 基本上 用户通过HTTP请求向服务器发送请求。”php’,即 服务器异步启动php代码。”更新.php',即 与用户的连接已完成 代码“update.php”仍在运行,并将在一段时间后完成 代码“update.php”已经完成 问题在于php异步运行某些外部代码 可能吗?还有别的办法吗?与shell_exec合作 求你了,我需要洞察力!最好是优雅的方式 谢谢大家! 您可以使用PHP构建服务。 或者使用bash:系统(“PHP myScript.PHP par
谢谢大家! 您可以使用PHP构建服务。
或者使用bash:
系统(“PHP myScript.PHP param param2&”)启动一个PHP脚本
您可以使用PHP构建一个服务。
或者使用bash:
系统(“PHP myScript.PHP param param2&”)启动一个PHP脚本
最好的方法是使用消息队列,比如RabbitMQ,甚至是简单的MySQL表
每次在前端控制器中添加新任务时,它都会进入队列。然后由cron job运行update.php,从队列中提取它,处理,保存结果,并将任务标记为已完成
此外,它还可以帮助您随着时间的推移分配负载,防止您自己的脚本导致的DoS。最好的方法是使用消息队列,如RabbitMQ,甚至是简单的MySQL表 每次在前端控制器中添加新任务时,它都会进入队列。然后由cron job运行update.php,从队列中提取它,处理,保存结果,并将任务标记为已完成
它还可以帮助您随着时间的推移分配负载,防止您自己的脚本引起的DoS。使用Redis resque或gearman查看工作进程使用Redis resque或gearman查看工作进程您可以让用户连接到update.php,生成某种唯一的ID来跟踪进程,然后使用一个特殊的GET变量对自身调用
fsockopen()
,表示它正在进行繁重的工作,而不是用户交互。立即关闭该连接,然后向用户打印相应的响应
同时,查找指定的特殊GET变量,并在出现时调用ignore\u user\u 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';
}
?>
您可以让用户连接到update.php,生成某种唯一的ID来跟踪流程,然后使用一个特殊的GET变量对其本身调用
fsockopen()
,表示它正在进行繁重的操作,而不是用户交互。立即关闭该连接,然后向用户打印相应的响应
同时,查找指定的特殊GET变量,并在出现时调用ignore\u user\u 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';
}
?>
您可以分叉一个进程,exec()一个外部程序并将其置于后台,或者在某个级别上让ignore\u user\u abort()忽略。您可以分叉一个进程,exec()一个外部程序并将其置于后台,或者在某个级别让ignore\u user\u abort()忽略。确保实现一些逻辑来检查作业是否已经在运行,您不希望在旧作业完成之前继续启动新作业,并使服务器陷入困境。请确保实现一些逻辑来检查作业是否已在运行,您不希望在旧作业完成之前不断启动新作业并使服务器陷入困境。命令末尾的&
意味着在单独的线程中启动新作业,这样您的php脚本就不会挂起。UNIX解决方案为+1。但是我在寻找一个跨操作系统的解决方案,然后使用这个:对于php作为服务的使用,我有过类似的体验,我必须发送短信,用户会上传一个csv文件:phone\u number;短信
我将启动脚本一次,在while 1
循环中,从sleep(n)
开始,我将检查目录中的任何文件,如果有,读取第十行,从文件中删除它们,并发送十条短信。命令末尾的&
意味着在单独的线程中启动此命令,这样您的php脚本就不会挂起。UNIX解决方案为+1。但是我在寻找一个跨操作系统的解决方案,然后使用这个:对于php作为服务的使用,我有过类似的体验,我必须发送短信,用户会上传一个csv文件:phone\u number;短信
我会启动脚本一次,在while 1
循环中,从sleep(n)
开始,我会检查目录中是否有任何文件,如果有,读取前十行,从文件中删除它们,然后发送十条短信。