2010-11-09 17 views
11

Ho bisogno di eseguire i seguenti script.PHP() - lo stato di ritorno è sempre 0

// File: script_a.php 
<?php exit(1); ?> 

// File: script_b.php 
<?php 
    system('php script_a.php', $return); 
    var_dump($return); 
?> 

Ora il mio problema: Sul mio sistema Windows in esecuzione script_b.php spettacoli int(1) come previsto. Sul nostro Unix-Server ottengo sempre int(0), ciò che mi rende impossibile controllare, se un certo errore si verifica all'interno dello script_a.php.

Qualcuno conosce questo problema e come risolverlo?

+2

Cosa contiene '$?' Quando si esegue script_a.php dalla riga di comando? –

+0

Che versione di php stai usando su server unix, confrontando con windows – RobertPitt

+0

Se eseguo script_b da riga di comando, tutto funziona correttamente. Cos'è $? –

risposta

0

Hai controllato se safe_mode è abilitato su server unix?

PHP Nota:

Nota: Quando safe-mode è abilitato, è possibile eseguire solo i file all'interno del safe_mode_exec_dir. Per motivi pratici , non è attualmente consentito di avere .. componenti nel percorso di l'eseguibile.

O forse la funzione di sistema è vietata per essere eseguita?

+0

safe_mode è disattivato. E il sistema può essere chiamato. Se inserisco alcune istruzioni di eco in script_a prima di uscire, posso normalmente recuperare quell'output, ma lo stato di uscita è ancora 0. –

+0

hai provato altri metodi di esecuzione? forse exec() o passthru() funziona correttamente – Rodrigo

+0

Ho provato entrambi, exec() e passthru(). Sulla riga di comando il risultato è come previsto ma l'esecuzione sul server web risulta in $ return pari a 0. –

1

Si potrebbe voler verificare se sta chiamando l'eseguibile php giusto sulla macchina Unix. Su molti sistemi UNIX è necessario chiamare l'eseguibile php-cli insted di php per l'uso sulla riga di comando. Un'altra cosa da controllare sarebbe permessi. Forse l'utente che esegue lo script script_b.php non ha le autorizzazioni per eseguire script_a?

1

__halt_compiler() è chiamato da qualche parte, in grado di verificare che?

+3

.... W h a t? –

+0

@Ignacio - posso replicare lo stesso output quando incorporo '__halt_compiler(); exit (1); ', e possibile il PHP nell'alias unix in qualcosa? – ajreal

+0

Non avrebbe fallito su entrambe le piattaforme in quel caso? –

1

Provare a effettuare la chiamata a PHP system con il percorso assoluto dell'eseguibile PHP e del nome file dello script, ad esempio system('/usr/bin/php /path/to/script_a.php', $return);. Forse è un problema di percorso. (Puoi trovare il percorso assoluto del tuo eseguibile PHP con: which php).

Inoltre, come suggerito da qualcuno, provare a eseguire il debug del valore restituito effettivo di script_a.php sul server UNIX eseguendo php script_a.php; echo $? nella riga di comando. Che echo emetterà l'ultimo valore restituito, cioè il valore restituito da script_a.php.

In ogni caso, suggerisco di fare un include con una dichiarazione return come descritto nell'Esempio n. 5 dello include() documentation. Se riesci ad adattare i tuoi script in questo modo, è un modo più efficiente di comunicarli.

// File: script_a.php 
<?php return 1; ?> 

// File: script_b.php 
<?php 
    $return = (include 'script_a.php'); 
    var_dump($return); 
?> 
0

Non riesco a riprodurlo neanche (PHP 5.3.3, Ubuntu).

Quando ho creato l'uscita valore a qualcosa di meglio grep-in grado, come "666", tracciando gli script restituiti anche cosa ci si aspetta:

strace -f php5 script_b.php 2>&1 | grep EXITSTATUS 

[pid 18574] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 666}], 0, NULL) = 18575 
waitpid(18574, [{WIFEXITED(s) && WEXITSTATUS(s) == 666}], 0) = 18574 

Il "-f" per strace diciamo che seguono bambino processi mentre si utilizza la chiamata di sistema. "2> & 1" reindirizza lo stderr allo stdout per lasciare tutto in sospeso. Puoi anche passarlo a "| less" per passare, ma l'output è lungo e non molto leggibile.

0

Non riesco a riprodurlo sul mio sistema, Ubuntu Hardy.Ecco un esempio:

/tmp$ mkdir /tmp/sbuzz 
/tmp$ cd /tmp/sbuzz 
/tmp/sbuzz$ echo '<?php exit(1); ?>' >script_a.php 
/tmp/sbuzz$ cat >script_b.php 
<?php 
    system('php script_a.php', $return); 
    var_dump($return); 
?> 
/tmp/sbuzz$ php script_b.php 
int(1) 
/tmp/sbuzz$ echo '<?php exit(2); ?>' >script_a.php 
/tmp/sbuzz$ php script_b.php 
int(2) 
/tmp/sbuzz$ 

Codice di uscita 0 indica l'esecuzione con successo del programma, in modo che tipo di suoni come si sta, magari usando script_a.php sbagliato o forse l'eseguibile "php" non sta facendo quello che sei aspettando? Forse hai uno script chiamato "php" che è nel tuo percorso prima dell'interprete? Che cosa segnala "quale php"? Sul mio sistema dice "/ usr/bin/php".

Se il PHP non riesce a trovare lo script, sarebbe uscire con 1, ad esempio:

/tmp/sbuzz$ cat script_b.php 
<?php 
    system('php doesnt_exist_script_a.php', $return); 
    var_dump($return); 
?> 
/tmp/sbuzz$ php script_b.php 
Could not open input file: doesnt_exist_script_a.php 
int(1) 
/tmp/sbuzz$ 

In questo caso ho cambiato lo script_b.php per cercare di eseguire uno script che non esiste, e ottengo il codice di uscita 1 (dovrebbe essere 2 se è stato completato correttamente, perché ho modificato lo script_a sopra), ma mostra anche l'errore che non è stato in grado di eseguire il programma.

Si potrebbe desiderare di provare a cambiare per eseguire specificamente il percorso completo del file eseguibile PHP:

system('/usr/bin/php script_a.php') 

o anche il percorso completo dello script così:

system('/usr/bin/php /tmp/sbuzz/script_a.php') 

Si potrebbe anche prova in particolare l'esecuzione di un programma che restituirà 1, proprio come un altro punto di dati, ad esempio:

system('false') 
system('bash -c "exit 69"') 

Si potrebbe voler provare un codice di uscita diverso da 1, che è un errore comune. Ecco perché ho fatto "exit 69" sopra. "False" uscirà con 1.

Inoltre, naturalmente, provare a eseguire direttamente lo script_a.php:

/tmp/sbuzz$ php script_a.php 
/tmp/sbuzz$ echo $? 
2 
/tmp/sbuzz$ 

Il "$?" è il codice di uscita dell'ultimo comando di esecuzione, al prompt della shell.

-3

Si potrebbe provare a passare un valore ottale a exit(). Guarda cosa succede allora.

+0

La prossima volta pubblicherò questa risposta come commento, quindi non può essere votata. – xaav

0

Prova:

<?php 
    die(1); 
?> 

Se non funziona così, controlla la stdout di:

strace php script_a.php 
-1

è necessario essere in esecuzione come root o usare sudo per accedere via php.

provare qualcosa di simile: -

system('sudo /usr/bin/php -f script_a.php', $return); 

nel vostro script_b.php

e modificare/etc/sudoers per aggiungere la seguente riga: -

apache ALL=(ALL) NOPASSWD: /usr/bin/php -f script_a.php 

se PHP non è in/usr/bin/php cambia quel riferimento e menziona anche il percorso completo del file script_a.php qualcosa come /var/www/html/script_a.php o percorso in cui si trova fisicamente.

Grazie.

+0

È sicuro? – mattalxndr

+2

perché mai avresti bisogno o vuoi usare sudo per un caso come questo? questo è un incubo per la sicurezza. cattiva, cattiva, cattiva, cattiva, cattiva idea. – taxilian

+0

Si prega di leggere questo link può cancellare dubbi http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch09_:_Linux_Users_and_Sudo –

0

Non sono sicuro se questi problemi sono correlati, ma si può dare un'occhiata a exec always returns -1 (or 127) come ho avuto un problema simile in passato ... anche se non l'ho risolto acually.

Nel tuo caso, potrebbe essere un altro problema, non so come sarebbe riproducibile, ma ho visto caeses dove la stringa di restituzione per un comando sconosciuto sarebbe la stringa di ritorno da bash (bash: command not found). Sulla maggior parte dei server non faccio nulla però. Si può provare e verificare l'impostazione della shell per l'utente corrente (presumo che sarebbe www-data)

0

Prendendo in considerazione di un commento che il problema si sta verificando nel sistema UNIX quando lo script_b è qualcosa di simile

sistema

('php script_a.php | tee myLogFile', $ return);

È possibile utilizzare questa sintassi

sistema ("bash -c 'php script_a.php | tee log.txt; esce \ $ {PIPESTATUS [0]}'", $ ritorno);

Fare man bash e cercare PIPESTATUS per ulteriori dettagli.

0

So che questo è un thread vecchio, ma ho appena avuto un problema simile.

Lo stato di uscita veniva impostato a 0 quando ho avuto lo script eseguito in background, qualcosa come

system('php script_a.php &', $return); 

Potrebbe avete fatto questo, ma solo generalizzando per migliorare la leggibilità?

Problemi correlati