gpt4 book ai didi

php - 使用 Symfony 控制台 (CTRL+C) 捕获终端终止/退出

转载 作者:可可西里 更新时间:2023-10-31 23:14:26 26 4
gpt4 key购买 nike

我已经构建了一个触发从互联网下载文件的命令,但是由于这些文件需要由另一个组件处理,我们需要确保每个已下载且在过去 10 年内未被修改的文件秒,是一个正确的视频,没有损坏/部分下载。

出于这个原因,我们需要找到一种方法来捕获 CTRL+C 或命令终止并清除任何未成功下载的适用文件。

到目前为止,这是我使用 symfony/consolesymfony/event-dispatcher 尝试的:

#!/usr/bin/env php
<?php

require_once(__DIR__ . '/../vendor/autoload.php');

use Symfony\Component\Console\Application;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\Console\Event\ConsoleTerminateEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;
use ImportExport\Console\ImportCommand;
use Monolog\Logger;

$dotenv = new Dotenv\Dotenv(__DIR__ . '/../');
$dotenv->load();

$logger = new Logger('console');

$dispatcher = new EventDispatcher();
$dispatcher->addListener(ConsoleEvents::TERMINATE, function (ConsoleTerminateEvent $event) {
// gets the command that has been executed
$command = $event->getCommand();

var_dump($command);
});

$application = new Application("Import-Export System", 'v0.1.0-ALPHA');
$application->add(new ImportCommand($logger));
$application->setDispatcher($dispatcher);
$application->run();

但是,如果我按 CTRL+C,var_dump() 永远不会显示在控制台中。

建议?

最佳答案

当您执行 CTRL+C 时,实际上发送的是 SIGINT,而不是 SIGTERM。我能想到的最好方法是使用 http://php.net/manual/en/function.pcntl-signal.php 注册处理程序并使用 pcntl_signal_dispatch 发送信号,例如:

pcntl_signal(SIGINT,'sigIntHandler');

function sigIntHandler() {
// Do some stuff
}

当然,您需要根据自己的需要进行调整。请注意,您还可以在命令中使用类方法,因此您可以使用通用 sigIntHandler() 创建一个 AbstractCommand 并将其注册到构造函数中:

pcntl_signal(SIGINT, [$this, 'sigIntHandler']);

然后在命令循环中使用 pcntl_signal_dispatch()(需要在每次迭代中调用)。

关于php - 使用 Symfony 控制台 (CTRL+C) 捕获终端终止/退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49004743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com