标签: symfony-process

锁文件不是最新的 composer.json 中的最新更改

我正在尝试克隆一个 github 存储库并composer install在其上发出一个。但我得到了这个:

警告:锁定文件不是最新的 composer.json 中的最新更改。您可能会得到过时的依赖项。运行更新以更新它们。

Your requirements could not be resolved to an installable set of packages.  
  Problem 1  
    - Conclusion: remove symfony/polyfill-intl-icu v1.9.0  
    - Installation request for symfony/polyfill-intl-icu v1.9.0 -> satisfiable by symfony/polyfill-intl-icu[v1.9.0].  
    - Conclusion: remove symfony/process v3.4.15  
    - symfony/polyfill-intl-icu v1.9.0 requires symfony/intl ~2.3|~3.0|~4.0 -> satisfiable by symfony/symfony[v4.0.0].  
    - don't install symfony/process v3.4.15|remove symfony/symfony v4.0.0  
    - don't install symfony/symfony v4.0.0|don't install symfony/process v3.4.15  
    - Installation request for symfony/process v3.4.15 -> satisfiable by symfony/process[v3.4.15].  
Run Code Online (Sandbox Code Playgroud)

跑步时 composer …

symfony composer-php symfony-process symfony4

10
推荐指数
3
解决办法
2万
查看次数

使用Symfony Process运行异步PHP任务

对于耗时的任务(电子邮件发送,图像处理......你明白了),我想运行异步PHP任务.

在Linux上很容易,但我正在寻找一种适用于Windows的方法.

我希望它变得简单,应该如此.没有火炮,没有SQL排队,没有一次又一次地安装东西 ......我只想运行一个该死的异步任务.

所以我尝试了Symfony Process Component.问题是,同步运行任务工作正常,但在异步运行时,它会沿主脚本退出.

有没有办法来解决这个问题?


composer require symfony/process
Run Code Online (Sandbox Code Playgroud)

的index.php

<?php
require './bootstrap.php';
$logFile = './log.txt';

file_put_contents($logFile, '');

append($logFile, 'script (A) : '.timestamp());

$process = new Process('php subscript.php');
$process->start(); // async, subscript exits prematurely…
//$process->run(); // sync, works fine

append($logFile, 'script (B) : '.timestamp());
Run Code Online (Sandbox Code Playgroud)

subscript.php

<?php
require './bootstrap.php';
$logFile = './log.txt';

//ignore_user_abort(true); // doesn't solve issue…

append($logFile, 'subscript (A) : '.timestamp());
sleep(2);
append($logFile, 'subscript (B) : '.timestamp());
Run Code Online (Sandbox Code Playgroud)

bootstrap.php中

<?php
require …
Run Code Online (Sandbox Code Playgroud)

windows asynchronous cross-platform symfony symfony-process

9
推荐指数
1
解决办法
5374
查看次数

如何从Symfony Process运行vi?

我有以下代码:

        $process = new Process('vi');

        try {
            $process->setPty(true);
            $process->mustRun(function ($type, $buffer) {
                echo $buffer;
            });
            //echo $process->getOutput();
        } catch (ProcessFailedException $e) {
            echo $e->getMessage();
        }

但是,它通过以下信息为我而死:

The command "vi" failed.

Exit Code: 1(General error)

Working directory: [path]

Output:
================
Vim: Error reading input, exiting...
Vim: Finished.


Error Output:
================
Vim: Warning: Output is not to a terminal
Vim: Warning: Input is not from a terminal

UPDATE

似乎某些人不清楚我将要做什么.我会解释.此脚本正在控制台中运行.同样的事情通过passthru工作(虽然Vim仍然警告输出).我希望有一个交互式进程,允许用户在发送某个文件之前修改它.我不想实现自己的编辑器,这就是我希望他们使用vi的原因.vi在我的服务器上可用(从我提供的输出中可以清楚地看到).

php symfony symfony-process

7
推荐指数
1
解决办法
686
查看次数

使用Symfony Process使用PHP控制交互式进程

我试图通过使用ssh-add向其添加新密钥来控制系统ssh-agent.为此我正在使用Symfony Process组件.

当我从一个网站运行这个代码时它工作得很好但是当我在shell/console中运行相同的代码时,ssh-add进程挂起 Enter passphrase for <path to key>:

代码的简化版本看起来像这样

use Symfony\Component\Process\Process;

$keyPath = '<path to key>';
$keyPassword = '<password for unlocking the key>';
$socketPath = '<path to ssh-agent socket>';

$sshAdd = new Process(
    "ssh-add {$keyPath}",
    null,
    [
        'SSH_AUTH_SOCK' => $socketPath
    ],
    $keyPassword
);
$sshAdd->run();
Run Code Online (Sandbox Code Playgroud)

正如您在上面的代码中看到的那样,我打电话给ssh-add,SSH_AUTH_SOCK在环境中设置,以便ssh-add与代理交谈,然后在输入中发送密码.正如我之前所说,当我在Web上下文中运行它时,它可以工作但它挂在shell /控制台上下文中.

strace在控制台中运行时做了一个,相关部分看起来像这样

open("<path to key>", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
write(4, "<key password>", <length of password>)      = 20
close(4)                                              = 0 …
Run Code Online (Sandbox Code Playgroud)

php shell process symfony symfony-process

6
推荐指数
1
解决办法
3668
查看次数

Symfony Process 组件返回退出代码 -1

我在某些机器上从 Symfony 进程命令获得退出代码 -1,而完全相同的代码返回退出代码 0,而在其他机器上除外。在这两种情况下,给定命令的输出都成功执行。

从 shell 运行相同的命令行会给出正确的退出代码 (0)。我制作了一个小测试用例来重现这个问题:

use Symfony\Component\Process\Process;
$process = new Process('./console');
$process->run();
echo $process->getExitCode();
Run Code Online (Sandbox Code Playgroud)

关于如何诊断这个的任何想法?

symfony symfony-process

5
推荐指数
1
解决办法
1376
查看次数

Symfony2 在后台运行控制台命令

我为我的 symfony2 项目创建了一个控制台命令,我想从控制器执行它而不阻塞控制器输出(在后台)。

通常是这样执行的:

$application = new Application($kernel);
$application->setAutoExit(true);

// AppBundle/Command/UpdateStockCommand.php
      $input = new ArrayInput(array(
          'command' => 'update:stock',
        ));

$output = new NullOutput();
$application->run($input, $output);
Run Code Online (Sandbox Code Playgroud)

但是像这样运行,用户将不得不等待任务完成,这可能需要几分钟。

一个解决办法是:

$kernel = $this->get('kernel');
$process = new \Symfony\Component\Process\Process('nohup php '. $kernel->getRootDir() .'/console update:stock --env='. $kernel->getEnvironment() .' > /dev/null 2>&1 &');
//$process->start();
$process->run();
Run Code Online (Sandbox Code Playgroud)

没有给出错误,控制器呈现输出,但不执行任务。

另一种解决方案是:

exec('/usr/bin/php '.$this->get('kernel')->getRootDir().'/console update:stock --env=dev > /dev/null 2>&1 &');
Run Code Online (Sandbox Code Playgroud)

在此处找到Symfony2 - 进程启动 symfony2 命令, 但不适用于我的示例。

background-process symfony symfony-process

5
推荐指数
1
解决办法
4561
查看次数

symfony/process - 静默处理而不是启动

在一个新的symfony2项目(这里描述的安装)中,我想作为请求的一部分启动一个控制台进程.该应用程序在nginx + php-fpm的"标准"ubuntu 14.04框上运行.

考虑一下这个控制器代码:

<?php
namespace AppBundle\Controller;


use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Process\Process;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class CommandController extends Controller
{
    /**
     * @Route("/command")
     * @return JsonResponse
     */
    public function commandAction ()
    {
        $rootDir = $this->get('kernel')->getRootDir();
        $env = $this->get('kernel')->getEnvironment();
        $commandline = $rootDir . '/console --env=' . $env . ' acme:hello --who jojo'
        $process = new Process($commandline);
        $process->start();
        return new JsonResponse(array('command' => $commandline));
    }
}
Run Code Online (Sandbox Code Playgroud)

当我向/ command发出请求时,我得到了我期望的结果并且该过程开始,例如我用htop等看到它.当我再次发出此请求时,我得到了我的预期结果,但是要启动的过程不会出现在任何地方.没有错误,没有任何错误.

重新启动php5-fpm服务使我能够再次通过请求启动一个进程,所以基本上我需要在每次请求后重新启动整个php服务.所以这可能不是编程问题.但老实说,我还不知道.问题是在stackoverflow之前描述的,Symfony2 - 进程启动一个symfony2命令,但exec的解决方法对我不起作用.

有人有线索吗?

谢谢,问候,jojo

php process nginx symfony symfony-process

4
推荐指数
1
解决办法
2350
查看次数

Libreoffice headless Process结果不返回,而是等待超时

我们已经使用了libreoffice --headless一段时间,首先是通过 Debian,在过去的几个月里我们切换到了 CentOS。我们使用Symfony Process命令将 a 转换docxpdf,简化的命令如下所示:

libreoffice --headless --convert-to pdf \ 
    --outdir /home/conversionoutdir \
    /home/conversionindir/4f00ac05aee274967b.docx
Run Code Online (Sandbox Code Playgroud)

执行上述命令的 Symfony 进程非常简单:

    $process = new Process($cmd);
    $process->mustRun();
Run Code Online (Sandbox Code Playgroud)

一切都工作正常,但几天后转换不再完成,该过程将一直等待,直到达到 60 秒超时。

一直在通过在我们的服务器上执行完全相同的转换来调试此问题DEV,一切都很好。还尝试转换小文档和大文档,以查看页数对于达到超时的影响。还直接在命令行上执行命令,转换也可以,并在几秒钟内完成。

我们的应用程序捕获异常,并将其发送到记录器:

进程 \"/usr/bin/libreoffice --headless --nologo --nofirststartwizard --norestore --convert-to pdf:writer_web_pdf_Export --outdir /home/conversionoutdir /home/conversionindir/4f00ac05aee274967b.docx\" 超出超时60 秒。

看来 PHP 无法再跟踪进程了。这里可能发生了什么?关于如何进一步调试这个的任何线索?

编辑:在抽象出 Symfony 进程组件、将conversionoutdir权限设置为 777 并执行以下代码片段后,如果从 PHP 执行,转换仍然会挂起:

$output = array();
exec('libreoffice --headless --convert-to pdf \ 
    --outdir /home/conversionoutdir \
    /home/conversionindir/4f00ac05aee274967b.docx', $output);
print_r($output);
Run Code Online (Sandbox Code Playgroud)

php symfony libreoffice symfony-process

4
推荐指数
1
解决办法
1860
查看次数

Symfony:重定向进程的输出

我正在将旧的 Symfony 应用程序 (v2.8) 升级到 Symfony 5.3。我正在使用进程组件,其中参数必须以不同于以前的方式传递。

我以前的代码就像

use Symfony\Component\Process\Process;

$cmd = sprintf('mysqldump mydatabase > %s', $outputTarget);
$process = new Process($cmd);
$process->run();
Run Code Online (Sandbox Code Playgroud)

现在,Symfony 的 Process 构造函数期望将二进制文件和参数作为数组传递(请参阅此处)。

如何实现新样式的输出重定向?

$process = new Process(['mysqldump', 'mydatabase', '>', $outputTarget]);
$process->run();
Run Code Online (Sandbox Code Playgroud)

不会起作用,因为>会被转义。

php symfony symfony-process symfony5

4
推荐指数
1
解决办法
1563
查看次数

Symfony2和后台进程

我的Symfony 2.3项目中有一个类正在执行一些http请求并需要一些时间.

我想将此任务作为后台进程运行,以便服务器返回客户端的答案,后台进程继续运行.

你知道如何在Symfony做到这一点吗?

我找到了Process组件:http://symfony.com/doc/current/components/process.html但我不确定我是否可以从那里运行类方法.

php background process symfony symfony-process

3
推荐指数
1
解决办法
4584
查看次数

使用 Symfony Process 组件进行 Ajax 轮询

我正在启动一个长时间运行的任务,该任务使用 Symfony Process 组件返回有关任务进度的增量输出。

其中一个示例显示了如何获取实时输出,另一个示例显示了如何运行异步任务。

我想要实现的是将 getIncrementalOutput 的结果传递回 ajax 轮询函数,以便我可以实时更新前端。

似乎在任何一种情况下 process->start() 都被阻塞,因为我的 ajax 调用需要一分钟才能返回,到那时任务已经完成。

我想我试图避免将进度写入数据库或文件并直接从正在运行的 PHP 任务中获取输出。

不确定是否有可能。

php ajax symfony symfony-process

3
推荐指数
1
解决办法
2798
查看次数

Symfony 进程 - 未找到命令

我正在尝试使用 Symfony 进程组件执行 ffmpeg 命令,但命令未被处理。我究竟做错了什么?我收到错误

命令“'ffmpeg -i [.........]'失败。退出代码:127(未找到命令)”

<?php 
$info = pathinfo($file);
$dir = "{$info['dirname']}/{$info['filename']}";
File::makeDirectory($dir, 0755, true)
$process = new Process(["ffmpeg -i {$info['basename']} -codec copy -map 0 -f segment -segment_list {$dir}/playlist.m3u8 -segment_list_flags +live -segment_time 10 {$dir}/{$info['filename']}_%02d.ts"]);
$process->setWorkingDirectory($info['dirname']);
$process->start();
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}
echo $process->getOutput();
?>
Run Code Online (Sandbox Code Playgroud)

php symfony symfony-process

-1
推荐指数
1
解决办法
4197
查看次数