在PHP脚本中调用时,无法通过Perl建立MySQL连接
我正在一个由PHP脚本调用的Perl脚本中创建到MySQL数据库的连接。以下是两个脚本: Perl:在PHP脚本中调用时,无法通过Perl建立MySQL连接,php,mysql,perl,Php,Mysql,Perl,我正在一个由PHP脚本调用的Perl脚本中创建到MySQL数据库的连接。以下是两个脚本: 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
#!/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
// script name = Test.php
$myResult=shell_exec("perl /path/MyCode.pl");
echo $myResult;
?>
PHP:
#!/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
// script name = Test.php
$myResult=shell_exec("perl /path/MyCode.pl");
echo $myResult;
?>
在命令行上执行时,Test.php打印“before…”和“…after”,并且在Perl代码中确实建立了DB连接。但是,当从我的(Chrome)浏览器执行Test.php时,所有打印内容都是“before…”,并且没有连接。并且不显示任何错误消息
为什么在命令行上成功,而不是在web服务器上成功?我的第一个猜测是:在PHP中,您使用“perl/path/MyCode.pl”执行它 Apache打开的shell位于与您不同的用户之下,并且该用户不在其路径中使用perl 尝试从完整路径使用Perl:“/full/path/to/Perl/path/MyCode.pl” 仅供参考:使用perl“scriptname”执行脚本不是一个好做法。相反,在shebang中定义Perl的完整路径,并始终使用完整路径启动脚本。这样可以避免这样的错误 问候,, Andras是的,PHP
shell_exec()
函数不捕获STDERR
要调试代码,可以在系统命令末尾添加2>&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;
问题已修复…我需要正确的路径规范:这是通过使用(在godaddy上)完成的:
use cPanelUserConfig;
在Perl脚本中访问我安装的DBD::mysql模块。问得好。好奇你为什么要这样做?当它在命令行而不是浏览器中工作时,我总是先进入权限。您的web服务器(apache?)是否具有运行perl和访问/path/MyCode.pl的权限?我有一个用perl编写的“后端”例程,它模拟了我的一个业务客户机的流程。事情在我需要的地方发生了变化a@MikeP离题,但你可以在发布评论的前五分钟内编辑评论。尝试更改
或使用死亡,或打印。这会让事情更清楚!现在我看到错误消息:install_driver(mysql)failed:在(eval 4)第3行的@INC(@INC-contains:/usr/local/lib64/perl5/usr/local/share/perl5/usr/lib64/perl5/vendor/usr/share/perl5/vendor_perl/usr/usr/lib64/perl5.)中找不到DBD/mysql.pm。可能DBD::mysql perl模块尚未完全安装,或者“mysql”的大写不正确。可用驱动程序:DBM、ExampleP、文件、Gofer、代理、SQLite、海绵。在家里……如果RaiseError
处于启用状态,则不需要在connect
之后安装或die
。另外,PrintError
是多余的,如果您已经在使用RaiseError
@MikeP,那么Web服务器用户可能正在运行与您在命令行上运行的perl
不同的perl。尝试在shell\u exec
中传递完整路径。您可能在从命令行执行之前设置了PERL5LIB确定感谢所有这些伟大的帮助。问题已修复…我需要正确的路径规范:这是通过在Perl脚本中使用:use cPanelUserConfig访问我安装的DMD::mysql模块来完成的(在godaddy上)。