在PHP中创建新线程(?)
可能重复:在PHP中创建新线程(?),php,multithreading,Php,Multithreading,可能重复: 我有一个PHP脚本,需要花费一些时间来处理。但是,我不希望查看器等待脚本完成。我希望他能够继续浏览和/或关闭浏览器。但我希望脚本继续工作。。。我该怎么做?有没有办法创建某种线程来允许这样的事情 p、 我真的不想用另一种语言重新编写脚本并通过操作系统执行它。您可以使用ajax 通过ajax调用需要很长时间才能执行的脚本,当结果准备好时,将其显示给用户好的,如果这样你可以做另一件事,你可以维护一个表来记录脚本执行的状态, 然后编写一个JavaScript代码,执行ajax调用以检查记
我有一个PHP脚本,需要花费一些时间来处理。但是,我不希望查看器等待脚本完成。我希望他能够继续浏览和/或关闭浏览器。但我希望脚本继续工作。。。我该怎么做?有没有办法创建某种线程来允许这样的事情
p、 我真的不想用另一种语言重新编写脚本并通过操作系统执行它。您可以使用ajax
通过ajax调用需要很长时间才能执行的脚本,当结果准备好时,将其显示给用户好的,如果这样你可以做另一件事,你可以维护一个表来记录脚本执行的状态,
然后编写一个JavaScript代码,执行ajax调用以检查记录的状态,如果为真,则检索数据并将其显示给用户。如果可以从CLI运行脚本,则可以通过调用以下命令将其从web服务器服务的脚本“分叉”到后台进程:
exec('php your_script.php > /dev/null &');
这将允许页面完成加载,但保持_script.php运行。避免在php中并行运行任务(线程或进程)。它有一些用于此目的的模块,但它们不是在每个平台上都可用,也不是PHP核心的一部分,因此您能够使用它们的机会非常低 这里有两个选项:
据我所知,PHP不提供任何执行此类任务的功能 一个有效的(尽管很难看)解决方案是创建soapweb服务,并通过覆盖“$oneWay”参数从脚本中使用扩展SoapClient调用它(http://www.php.net/manual/en/soapclient.dorequest.php).
在这种情况下,发出单向请求意味着您的脚本不需要等待响应,代码将继续执行。用户可以导航到其他页面或关闭浏览器,然后脚本执行将被中断/丢失。。。这就是为什么我把我的问题贴在stackoverflow上…@VladislavZorov:因为AJAX(JS)在客户端上运行。用户可能会中断调用(或者完全禁用JS),如果操作很长,请求可能会超时,等等。问题不在于AJAX,而在于能否在后台运行PHP操作。这两个是不可混淆的。这是我过去的经历,忽略这一点。PHP不一定在网站上使用。例如,我正在使用PHP构建一个电报机器人,因此您的答案不能用于此目的。我可以使用$\u GET通过您的方式将数据发送到我的脚本吗?一个示例是:exec('php my_script.php?somevalues>/dev/null&')@JohnRoach
exec
将在操作系统中运行命令。所以您必须以这种方式传递参数,这里不涉及HTTP(GET、POST等都是HTTP方法)。你说这是一种丑陋的方式为什么?看来您的解决方案正是我想要的。使用事件池或不同的线程来实现这些目的会更自然。尽管您需要创建接受客户端请求的SOAP服务器、实现单向SOAP客户端等,但此解决方案仍然有效。。。
class AsyncSoapClient extends SoapClient {
function __construct($wsdl, $options) {
parent::__construct($wsdl, $options);
}
function __doRequest($request, $location, $action, $version, $oneWay = TRUE) {
return parent::__doRequest($request, $location, $action, $version, TRUE);
}
}
$client = new AsyncSoapClient(
NULL,
array(
'location' => $location,
'uri' => $uri
)
);
$client->invokeMethodOnServer($yourParameters);