2015-04-14 15 views
5

Tworzę połączenie z bazą danych MySQL w skrypcie Perla, wywoływanym przez skrypt PHP. Oto 2 skrypty:Nie można utworzyć połączenia MySQL za pośrednictwem języka Perl po wywołaniu w skrypcie PHP

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; 
?> 

Kiedy wykonywane w wierszu poleceń, test.php drukuje „przed .. . "i" ... after ", a połączenie DB jest rzeczywiście ustanowione w kodzie Perla. Jednak gdy Test.php jest wykonywany z mojej przeglądarki (Chrome), wszystko, co drukuje, jest "przed ..." i nie nawiązano połączenia. Wyświetlany jest komunikat o błędzie no.

Dlaczego w wierszu poleceń występuje sukces, ale nie pochodzi on z serwera WWW?

+0

Dobre pytanie. Ciekawe, dlaczego zrobiłbyś to w ten sposób? –

+2

Kiedy działa w wierszu poleceń, a nie w przeglądarce, zawsze najpierw idę do uprawnień. Czy twój serwer WWW (apache?) Ma pozwolenie na uruchamianie Perla i uprawnienia dostępu do/path/MyCode.pl? – kainaw

+0

Mam procedurę "backend" napisaną w Perlu, która symuluje proces dla jednego z moich klientów biznesowych. Wszystko zmieniło się w miejscu, w którym potrzebowałem – MikeP

Odpowiedz

0

Moje pierwsze przypuszczenie: od PHP wykonać go z „perl /path/MyCode.pl”

Skorupa otworzył Apache znajdują się pod innego użytkownika niż ty, i że użytkownik nie perl w nim ścieżki.

Spróbuj użyć Perl z pełną ścieżką: "/ pełna/ścieżka/do/Perl /path/MyCode.pl"

FYI: Wykonywanie skryptów Perl "Nazwa_skryptu" nie jest dobrą praktyką. Zamiast tego określ pełną ścieżkę do swojego Perla w shebangu i zawsze uruchamiaj skrypt, używając pełnej ścieżki. W ten sposób można uniknąć takich błędów.

Pozdrawiam, Andras

2

Tak, PHP shell_exec() funkcja nie przechwytywania stderr.

Do debugowania kodu, można dodać 2>&1 na końcu polecenia systemu przekierować stderr do STDOUT:

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

Można także konfigurację modułu DBI do umrzeć jeśli jakiś błąd występuje w czasie wykonywania:

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

Cóż, to sprawia, że ​​rzeczy są o wiele jaśniejsze! Teraz widzę komunikat o błędzie: install_driver (mysql) nie powiodło się: nie można zlokalizować DBD/mysql.pm w @INC (@INC zawiera:/usr/local/lib64/perl5/usr/local/share/perl5/usr/lib64/perl5/vendor_perl/usr/share/perl5/vendor_perl/usr/lib64/perl5/usr/share/perl5.) na linii (eval 4) 3. Być może moduł DBD :: mysql perl nie został w pełni zainstalowany, lub być może kapitalizacja "mysql" nie jest właściwa. Dostępne sterowniki: DBM, ExampleP, File, Gofer, Proxy, SQLite, Gąbka. w/home .... – MikeP

+0

Nie potrzebujesz 'lub die' po' connect', jeśli 'RaiseError' jest włączony. Ponadto, 'PrintError' jest zbędny, jeśli już używasz' RaiseError'. – ThisSuitIsBlackNot

+0

@MikeP Użytkownik serwera WWW może mieć inny "perl" niż w wierszu poleceń. Spróbuj podać pełną ścieżkę w 'shell_exec'. – ThisSuitIsBlackNot

0

problem stałej ... musiałem poprawną specyfikację ścieżki: odbywa się to (na GoDaddy) za pomocą:

use cPanelUserConfig; 

w skrypcie Perla, aby uzyskać dostęp do zainstalowanego modułu DBD :: mysql.

Powiązane problemy