Если только цели состоит в том, чтобы быть в состоянии остановить сценарий, вам не нужно полное выполнение петлевого события, я думаю. Вы можете прослушивать локальный сокет и прерываться при получении данных.
Вы могли бы, например, запустить это в 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, который является отличной реализацией цикла событий, который работает на несколько различных расстановок. Он также включает таймеры и другие полезные библиотеки.
Вы можете посмотреть на этой BlogPost серии, чтобы получить представление о https://blog.wyrihaximus.net/2015/01/reactphp-introduction/
Он не может ..... особенно как каждый запрос запускается в своем собственном независимом потоке, и поэтому они не могут взаимодействовать с другими потоками –
@Alaeddine - Но stopAction не может работать, если запущен цикл launchAction –
@MarkBaker я могу что-то сделать в loopAction, как класс Evloop, чтобы остановить цикл? – Devilion