【问题标题】:Unable to make a MySQL connection through Perl when called in a PHP script在 PHP 脚本中调用时无法通过 Perl 建立 MySQL 连接
【发布时间】:2015-06-20 10:40:34
【问题描述】:

我正在一个 Perl 脚本中创建与 MySQL 数据库的连接,该脚本由 PHP 脚本调用。以下是 2 个脚本:

Perl:

#!/usr/bin/perl
# script name = MyCode.pl
use DBI;
my $data_source = q/dbi:mysql:name:localhost/;
my $user = q/myname/;
my $pwd = q/pword/;

print "before...\n";
# Connect!
$dbhandle= DBI->connect($data_source,$user,$pwd) or die "can't connect
       $data_source: $DBI::errstr \n";
print "...after \n";

PHP:

<?php
 // script name = Test.php
 $myResult=shell_exec("perl /path/MyCode.pl");
 echo $myResult;
?>

在命令行上执行时,Test.php 会打印“before...”和“...after”,并且 DB 连接确实在 Perl 代码中建立。但是,当从我的(Chrome)浏览器执行 Test.php 时,打印的所有内容都是“之前...”并且没有建立连接。并显示no错误信息。

为什么在命令行上会成功,而从 Web 服务器却没有?

【问题讨论】:

  • 好问题。好奇你为什么要这样做?
  • 当它在命令行而不是在浏览器中工作时,我总是先去权限。您的网络服务器(apache?)是否有权运行 perl 并有权访问 /path/MyCode.pl?
  • 我有一个用 Perl 编写的“后端”例程,用于模拟我的一个业务客户的流程。事情在我需要的地方发生了变化
  • @MikeP 离题,但您可以在发布后的前五分钟内编辑 cmets。
  • 尝试将or die 更改为or print

标签: php mysql perl


【解决方案1】:

是的,PHP shell_exec() 函数不捕获 STDERR。

要调试您的代码,您可以在系统命令末尾添加2&gt;&amp;1 以将STDERR 重定向到STDOUT

$myResult = shell_exec("perl /path/script.pl 2>&1");

此外,如果在运行时发生错误,您可以将 DBI 模块设置为 die

$dbh = DBI->connect($data_source,$user, $pwd, { RaiseError => 1, PrintError => 0}) or die $DBI::errstr;

【讨论】:

  • 这让事情变得更清楚了!现在我看到错误消息: install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64 /perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) 在 (eval 4) 第 3 行。也许 DBD::mysql perl 模块尚未完全安装,或者也许“mysql”的大写不正确。可用驱动程序:DBM、ExampleP、File、Gofer、Proxy、SQLite、Sponge。在 /home....
  • 如果RaiseError 开启,则不需要or die 跟在connect 之后。此外,如果您已经在使用RaiseErrorPrintError 是多余的。
  • @MikeP 网络服务器用户运行的perl 可能与您在命令行上运行的不同。尝试在shell_exec 中传递完整路径。
  • 您可能在从命令行执行之前设置了 PERL5LIB
  • 好的,感谢您提供的所有帮助。问题已解决...我需要正确的路径规范:这是通过使用(在 godaddy 上)完成的:在 Perl 脚本中使用 cPanelUserConfig 来访问我安装的 DMD::mysql 模块。
【解决方案2】:

问题已解决...我需要正确的路径规范:这是通过使用(在 godaddy 上)完成的:

use cPanelUserConfig;

在 Perl 脚本中访问我安装的 DBD::mysql 模块。

【讨论】:

    【解决方案3】:

    我的第一个猜测:在 PHP 中,您使用“perl /path/MyCode.pl”执行它

    Apache 打开的 shell 与你的用户不同,并且该用户不在它的路径中。

    尝试从完整路径使用 Perl:“/full/path/to/perl /path/MyCode.pl”

    仅供参考:使用 perl "scriptname" 执行脚本不是一个好习惯。而是在 shebang 中定义 Perl 的完整路径,并始终使用完整路径启动脚本。这样你就可以避免这样的错误。

    问候, 安德拉斯

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2015-02-01
      • 2017-02-12
      • 2011-07-03
      • 1970-01-01
      相关资源
      最近更新 更多