我有一个symfony作业,它有两个功能: 发射和停止。 我的启动功能将从数据库导入联系人,例如4比4,并发送给所有联系人。
public function launchAction()
{
$offset = 0;
$limit = 4;
$sizeData /= $limit;
for( $i = 0; $i < $sizeData; $i++)
{
$contacts = $repository->getListByLimit($offset, $limit);
$sender->setContacts($contacts);
$sender->send();
$offset += $limit;
}
}
当我启动启动功能时,导入并将消息发送给所有联系人需要20秒 但如果我想停止它,停止功能如何中断启动功能
public function stopAction()
{
}
答案 0 :(得分:2)
我不会完全回答,但会给你两个暗示它是如何起作用的
1:
在launch()
上保存具有进程ID的文件在stop()上你可以检查是否存在并通过id
终止进程2:
在launch()上,您可以检查循环中的特定数据库条目,以便在存在值时中断
停止时设置此数据库条目
答案 1 :(得分:1)
如果您的唯一目的是能够停止脚本,我认为您不需要完整的事件循环实现。您可以收听本地套接字,并在收到数据时中断。
您可以在launchAction
public function launchAction()
{
$offset = 0;
$limit = 4;
$sizeData /= $limit;
// Init IPC connection
$server = stream_socket_server("tcp://127.0.0.1:1337", $errno, $errorMessage);
if ($server === false) {
throw new UnexpectedValueException("Could not bind to socket: $errorMessage");
}
for( $i = 0; $i < $sizeData; $i++)
{
// Check our socket for data
$client = @stream_socket_accept($server);
if ($client) {
// Read sent data
$data = fread($client, 1024);
// Probably break
if ($data === 'whatever') {
break;
}
}
$contacts = $repository->getListByLimit($offset, $limit);
$sender->setContacts($contacts);
$sender->send();
$offset += $limit;
}
// Close socket after sending all messages
fclose($client);
}
并且stopAction
可以点击套接字来终止连接,如下所示:
public function stopAction()
{
$socket = stream_socket_client('tcp://127.0.0.1:1337');
fwrite($socket, 'whatever');
fclose($socket);
}
如果您在同一台计算机上运行这两个函数,这应该可以工作。另请注意,PHP只能侦听尚未占用的套接字。因此您可能需要更改端口号。如果你开始第二个进程并行发送消息,那么新的进程将无法绑定到同一个套接字。
一个很好的博客文章解释了一些细节是https://www.christophh.net/2012/07/24/php-socket-programming/
如果您希望开始一个长时间运行的过程,我建议您查看ReactPHP,这是一个在几种不同设置上运行的出色的事件循环实现。它还包括计时器和其他有用的库。
您可能需要查看此博客帖子系列,以获得一个想法https://blog.wyrihaximus.net/2015/01/reactphp-introduction/