有没有一种在PHP中实现多线程模型的现实方法,无论是真实的,还是仅仅模拟它.一段时间后,有人建议你可以强制操作系统加载另一个PHP可执行文件实例并处理其他同步进程.
这个问题是当PHP代码完成执行时,PHP实例仍然在内存中,因为没有办法从PHP中删除它.因此,如果您正在模拟几个线程,您可以想象会发生什么.所以我仍然在寻找一种可以在PHP中有效地完成或模拟多线程的方法.有任何想法吗?
我需要在用户操作时执行目录副本,但目录非常大,所以我希望能够执行这样的操作,而无需用户知道副本完成所需的时间.
任何建议将不胜感激.
我的脚本由服务器调用.从服务器我会收到ID_OF_MESSAGE
和TEXT_OF_MESSAGE
.
在我的脚本中,我将处理传入的文本并使用params生成响应:ANSWER_TO_ID
和RESPONSE_MESSAGE
.
问题是我正在向incomming发送响应"ID_OF_MESSAGE"
,但是在收到http响应200之后,向我发送消息的服务器将把他的消息设置为发送给我(这意味着我可以发送给他的响应).
解决方案之一是将消息保存到数据库并制作一些将每分钟运行的cron,但我需要立即生成响应消息.
是否有一些解决方案如何发送到服务器http响应200而不是继续执行PHP脚本?
非常感谢
有没有办法在PHP中关闭连接(基本上告诉浏览器,而不是没有更多的数据),但继续处理.我想到的具体情况是我想要提供缓存数据,然后如果缓存已过期,我仍然会提供缓存数据以获得快速响应,关闭连接,但继续处理以重新生成并缓存新数据.基本上唯一的目的是使网站看起来更具响应性,因为在用户等待内容重新生成时不会偶尔出现延迟.
更新:
PLuS最接近我正在寻找的答案.为了澄清一些人,我正在寻找能够实现以下步骤的东西:
更新:
这很重要,它必须是纯粹的PHP解决方案.安装其他软件不是一种选择.
有人可以展示如何使用fastcgi_finish_request()
函数的简单示例吗?我用谷歌搜索,但只发现了一些一般提及它,有些人说他们成功使用它但我找不到一个代码的例子.
例如,我有一个PHP对象.要向浏览器发送响应,我会生成HTML,然后通过它返回getResult()
.然后回应结果.
像这样:
$obj = new controller();
echo $o->getResult();
Run Code Online (Sandbox Code Playgroud)
假设我想利用这种优化技术将结果发送到浏览器,然后完成一些可能很长的过程,比如连接到某些API,比如Facebook API.
我该怎么做呢?我明白,基本上我可以调用fastcgi_finish_request();
然后继续执行PHP脚本.
我只需要查看示例代码,我自己也不够聪明.
我试图完成与之前的Python问题完全相同的事情,但在PHP中.请参阅我以前的(已回答)问题
上一个问题的PHP脚本做了一些事情,然后在同一台服务器上运行另一个PHP脚本,做了一些事情然后退出(而第二个脚本仍然继续它的工作).我该如何实现这一目标?
请注意,PHP脚本同时也是一个网页(所以也许我们可以像以前的问题一样使用它,我的问题的答案是片段,这使得python只是打开url而不是运行子进程...虽然我没有有一个线索,如果这是有用的信息,也许它在PHP中不同,我在PHP中没有太多的经验)...而且我想让每个脚本独立 - 所以如果第一个PHP脚本将完成我想第二个PHP脚本到即使第一个结束,继续工作.
您认为最优雅的方式是什么?会回应iframe的工作还是应该以不同的方式做到这一点?
用户提交表单后,我想渲染一个视图文件,然后我想启动一个后台任务来处理五个MS Excel文件(每个文件最多可能有2000行),但是这样就让用户不要不必等待该过程完成才能查看该页面.任务完成后,我将通过电子邮件通知用户.
我正在使用Symfony Framework 3.我在下面包含了我的代码.它没有做我想要实现的目标.提交表单后,页面仅在整个后台任务完成时加载.
我不确定但是经过google搜索后,我认为kernel.terminate事件在这里很有用.但我似乎无法理解如何使用它.
你能告诉我如何解决这个问题吗?
这是我的代码:
我创建了一个控制台命令:
class GreetCommand extends ContainerAwareCommand {
protected function configure()
{
$this->setName('hello:world');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
// My code to execute
}
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中我有
$process = new Process('ls -lsa');
$process->disableOutput();
$that = $this;
$process->start(function ($type, $buffer) use ($that) {
$command = new GreetCommand();
$command->setContainer($this->container);
$input = new ArrayInput(array());
$output = new NullOutput;
$resultCode = $command->run($input, $output);
});
return $this->render('success.html.php', array('msg' => 'Registraion Successful'));
Run Code Online (Sandbox Code Playgroud)
我已经使用PHP的连接处理功能解决了这个问题.
感谢这篇文章
我看了看这个问题.我正在寻找一种方法来做那个问题的OP也想要的,那就是在发送http响应之后继续处理php,但是在Symfony2中.
我实现了一个在每次内核终止后触发的事件.到目前为止一切都那么好,但我想要的是它在CERTAIN终止后,在特定的控制器动作中触发,例如在发送表单之后,而不是每次请求时.这是因为我想在某些时候做一些繁重的任务,并且不希望最终用户等待页面加载.
知道我该怎么办?
<?php
namespace MedAppBundle\Event;
use JMS\DiExtraBundle\Annotation\InjectParams;
use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\Tag;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use JMS\DiExtraBundle\Annotation\Inject;
/**
* Class MedicListener
* @package MedAppBundle\EventListener
* @Service("medapp_test.listener")
* @Tag(name="kernel.event_subscriber")
*/
class TestListener implements EventSubscriberInterface
{
private $container;
private $logger;
/**
* Constructor.
*
* @param ContainerInterface $container A ContainerInterface instance
* @param LoggerInterface $logger A LoggerInterface instance
* @InjectParams({
* "container" = @Inject("service_container"),
* "logger" = @Inject("logger")
* })
*/ …
Run Code Online (Sandbox Code Playgroud) 我正在使用PHP运行Apache的标准配置.我想知道当客户端请求导致PHP脚本执行的页面时会发生什么,然后客户端在脚本完成之前终止来自服务器的请求.Apache是否以某种方式杀死脚本,或者它是否允许完成?
任何人都知道如何关闭连接(除了flush()
?),但之后继续执行一些代码.
我不希望客户端看到页面完成后可能发生的漫长过程.