система ('php file.php'); не работает, почему? - PullRequest
0 голосов
/ 13 октября 2008

ни

<?php system('php file.php'); ?>

ни

<?php system('/usr/bin/php file.php'); ?>

работал. Почему?

Я пробовал с -q, с !#/usr/bin/php и т. Д.

Ответы [ 12 ]

4 голосов
/ 13 октября 2008

Вы должны вызывать его с -f, но он должен работать и без него:

<?php system('/usr/bin/php -f file.php'); ?>

Что вы подразумеваете под "это не работает"?

Вы хотите, чтобы содержимое выводилось так, как если бы оно было из вашего скрипта? Использование включает или требует .

Вы хотели содержимое в переменной? Используйте оператор backtick .

Вы можете увидеть, что вы получаете от команды, используя оператор backtick вместо system.

1 голос
/ 13 октября 2008

Может быть из-за безопасного режима.

Note: When safe mode is enabled, you can only execute files within the safe_mode_exec_dir. For practical reasons, it is currently not allowed to have .. components in the path to the executable.

http://www.php.net/system.

0 голосов
/ 14 октября 2008

}} Под «не работает» я имел в виду: он ничего не возвращает и не печатает.

Попробуйте установить терминал / оболочку на своем сервере и попробовать системную команду. Если ваша ОС unixy, вы можете использовать что-то вроде , который php , чтобы найти правильный путь к php cli.

Вы правильно установили php cli? Обычно он не устанавливается по умолчанию.

Ваш веб-сервер делает chroot или что-то? Возможно, php cli не существует в среде, где вы пытаетесь использовать system ().

Вместо того, чтобы пытаться вызвать скрипт, попробуйте создать простую систему ('php -v') . Как только вы получите это, чтобы правильно вывести номер версии php, добавьте вызов в ваш скрипт.

0 голосов
/ 13 октября 2008

Попробуйте:

$fp = popen('/usr/bin/php -f file.php', 'r');

if(false === $fp)
{
   // something bad happened: error handle
}

$contents = '';

while(false === feof($fp))
{
  $contents .= fgets($fp);
}

fclose($fp);    
echo $contents;

Это позволит вам захватить выходные данные подоболочки и перехватить ошибки.

0 голосов
/ 13 октября 2008

Погоди ... Чего ты на самом деле пытаешься достичь здесь? Просто запустите a.php и верните вывод в браузер? В этом случае включает it. Судя по вашему опубликованному содержимому a.php (<? Php echo 'hello world';?>), Это то, что вы хотите.

Если есть еще что-то в содержании a.php, пожалуйста, отправьте сообщение и объясните, что вы действительно хотите сделать.

0 голосов
/ 13 октября 2008

Попробуйте:

$output = array();
$returnCode = 0;
exec('/usr/bin/php -f /Applications/MAMP/htdocs/a.php 2>&1', $output, $returnCode);
print_r($output);

2>&1 перенаправляет stderr на стандартный вывод, поэтому любые сообщения об ошибках будут записываться в $output

0 голосов
/ 13 октября 2008

Вы, очевидно, не понимаете, как работает функция system . Что вам действительно нужно, это, вероятно, popen . Запустите процесс с popen , а затем прочитайте его вывод, например, с помощью fgets .

В качестве альтернативы, вы можете использовать оператор backtick, как уже было предложено другими.

0 голосов
/ 13 октября 2008

Когда я меняю

system('/usr/bin/php -f /Applications/MAMP/htdocs/a.php',$b);

для

('/bin/php -f /Applications/MAMP/htdocs/a.php',$b);

тогда он говорит 127 вместо 5, я думаю, это коды ошибок

0 голосов
/ 13 октября 2008

Что он говорит при включении отчетов об ошибках?

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
$a = system('/usr/bin/php -f /Applications/MAMP/htdocs/a.php',$b);
print_r($a);
echo '-'; # for separation
print_r($b);
0 голосов
/ 13 октября 2008

Спасибо всем за ответы !!

Для «не работает» я имел в виду: он ничего не возвращает и не печатает.

У меня есть два файла a.php && b.php (со всеми разрешениями), и safe_mode выключен

b.php

<?php
$a = system('/usr/bin/php -f /Applications/MAMP/htdocs/a.php',$b);
print_r($a);
echo '-'; # for separation
print_r($b); ?>

и a.php

<?php echo 'hello world'; ?>

и когда я запускаю b.php из моего браузера (localhost / b.php), он печатает:

string (0) "" -INT (5) * * 1016

это означает, что переменная $ b равна 5, но ... 5 что?

...