【问题标题】:How do I call a perl script from my Symfony2 controller?如何从 Symfony2 控制器调用 perl 脚本?
【发布时间】:2012-11-09 05:23:47
【问题描述】:

我正在尝试从我的 Symfony2 应用程序中实现向信息管理系统的自动提交。其他人为提交编写了一个 perl 脚本。我只需要使用控制器从实体中获取值作为参数传递给脚本。

我已经通过从命令行运行一个简短的 php 脚本来测试 perl 脚本:

<?php

$perlscript = 'test_submit_to_lims.pl';

$output = \shell_exec('perl ' . $perlscript . " 'arg1' 'arg2' 'arg3' ");
echo $output;

?>

这将返回一个字符串,其中包含我的应用程序所需的一些感兴趣的值。

我已将 perl 脚本和依赖文件放在一个名为 dependencies 的文件夹中,与我的 Symfony 项目文件夹处于同一级别

我尝试在我的控制器中使用类似的代码:

...

$arg1 = $form->get('arg1')->getData();
$arg2 = $form->get('arg2')->getData();
$arg3 = $form->get('arg3')->getData();
$pathToScript = '/opt/sfprojects/dependencies';
$perlScript = "$pathToScript/test_submit_to_lims.pl";
$output = \shell_exec('perl '.$perlScript." $arg1 $arg2 $arg3 ");
var_dump($output);

...

这给了我“网络错误:500 内部服务器错误 - http://www2-mywebsite.org/myEntity/create

我不确定这个错误是由我的 php 代码中的一些简单的东西引起的,还是由于需要在 Symfony 配置文件中以某种方式启用 perl 或其他诸如脚本的位置、文件权限等原因。

如果有任何关于我可能出错的想法,我将不胜感激。

【问题讨论】:

  • 我不认为你的 500 来自 Perl。既然你做了一个系统调用,为什么要给你一个 HTTP 状态码呢?也许有些事情失败了,以至于您在没有先发送 HTTP 标头的情况下将数据发送回客户端?
  • 对不起,应该更明确,我知道错误不在 perl 代码中,因为当我运行一个执行它的简短 php 脚本时,它工作正常。错误的根源在我的控制器类中,所以我在那里执行脚本的方式一定有问题。
  • 您的应用失败的原因可能有很多。尝试通过 app_dev.php 前端控制器运行您的应用程序或查看日志以找出问题所在。
  • 我发现并纠正了一个错误——即我传入的变量需要用单引号括起来,因为有些变量包含由多个单词组成的字符串。如果不这样做,看起来每个单词都是一个单独的参数。但是,它仍然不起作用。

标签: php perl symfony controller


【解决方案1】:

检查您的网络服务器和 Symfony 日志,看看您遇到了什么样的错误。 Symfony 日志位于项目的 app/logs 目录中(默认情况下)。服务器日志位置取决于您的配置。

请记住,您可以使用开发控制器 (app_dev.php) 查看有关错误的更多详细信息(包括堆栈跟踪)。

要实际运行您的命令,请考虑使用Process component

【讨论】:

  • 感谢您的建议。我尝试使用流程组件。 $process-&gt;getErrorOutput() 返回:''perl' 不被识别为内部或外部命令、可运行程序或批处理文件。'我尝试将 perl 称为“/usr/bin/perl”,但错误是:“系统找不到指定的路径。”
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2012-07-23
  • 2011-01-31
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多