【问题标题】:Asynchronous PHP?异步PHP?
【发布时间】:2012-01-30 09:57:58
【问题描述】:

我有一个 PHP 脚本,它会进行大量检查,然后将文件下载到服务器并输出原始文件。
下载我使用的文件

system("/usr/local/bin/wget -O ...");

所以 php 等待下载完成,然后输出文件。
我的问题是是否可以在某处(其他 php 文件?)发送“ping”以开始下载,然后无需等待结果即可继续执行。

【问题讨论】:

标签: php linux system


【解决方案1】:

使用curl_multi_* 函数并行处理多个下载。 PHP 缺乏任何类型的线程支持,进程分叉只是一种 hack。

【讨论】:

  • 我没有多个下载,文件只有一个。我只想在文件下载时继续执行。
【解决方案2】:

使用pcntl_fork() 将当前进程分叉为子进程。在您的父进程可以继续执行其任务的同时在子进程中下载文件。

$pid = pcntl_fork(); 

if ( $pid == -1 ) 
{        
    // Fork failed            
    exit(1); 
} 
else if ( $pid ) 
{ 
    // The parent process
   //continue what you want to do here
} 
else 
{ 
    // the child process 
    // do the system call here
}

做了一些工作后,如果你现在需要父进程等到子进程完成,你可以pcntl_waitpid($pid)。

阅读here 了解有关 pcntl 方法的更多文档。

【讨论】:

  • pcntrl 函数不建议在 web 环境中使用,仅适用于 *nix 系统 - uk.php.net/manual/en/intro.pcntl.php
  • 自从他标记了问题 linux,我想我们可以有把握地假设他在 linux 机器中运行它。至于你的另一点,你是对的。 Pcnlt 函数只能从 CLI 运行。
  • 仍然“不建议在 Web 环境中使用”——例如,这将在最糟糕的时刻崩溃并烧毁。
  • @Piskvor:它不会“崩溃和燃烧”。如果从 cgi 环境运行,它会优雅地抛出一个错误,因为 PHP 的 CGI 版本中不存在 pcntl 函数
  • @xbonez:嗯,这可以解释 - 我在网络服务器上看到过这个,但它一定是被当地人入侵到源代码中的。解释风景如画的崩溃。
【解决方案3】:

一般的设计模式是应用命令设计模式:http://en.wikipedia.org/wiki/Command_pattern

您可以在本地 Web 环境中实现此功能,也可以安装某种队列服务器,例如:http://www.rabbitmq.com/ 等。

这取决于您的系统、对它们的访问以及您的知识,以确定哪种解决方案最适合。这是一个更复杂的问题,离题太远了。

一般而言,建议的模式将允许您解决问题而不会出现很多问题,因为它是一种众所周知且广泛使用的方法来处理大量任务,而这些任务在请求中直接执行需要很长时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多