PHP – выполнить веб-скрипт как сценарий командной строки?

Используя PHP версию 5.4.28, я пытаюсь выполнить следующее:

У меня есть комментарии и код для трех тестовых файлов: «otherevent.php», «app.php» и «test.php», который является тестовым файлом, используемым для отладки ошибок. Вот оно:

test.php:

echo $argv[1] . " TADA!"; exit(); ?> 

otherevent.php (обрезается и подвергается цензуре, для конфиденциальной информации):

 require_once( 'Facebook/FacebookSession.php' ); require_once( 'Facebook/FacebookRedirectLoginHelper.php' ); require_once( 'Facebook/FacebookRequest.php' ); require_once( 'Facebook/FacebookResponse.php' ); require_once( 'Facebook/FacebookSDKException.php' ); require_once( 'Facebook/FacebookRequestException.php' ); require_once( 'Facebook/FacebookServerException.php' ); require_once( 'Facebook/FacebookOtherException.php' ); require_once( 'Facebook/FacebookAuthorizationException.php' ); require_once( 'Facebook/GraphObject.php' ); require_once( 'Facebook/GraphSessionInfo.php' ); require_once( 'Facebook/GraphUser.php' ); use Facebook\FacebookSession; use Facebook\FacebookRedirectLoginHelper; use Facebook\FacebookRequest; use Facebook\FacebookResponse; use Facebook\FacebookSDKException; use Facebook\FacebookRequestException; use Facebook\FacebookServerException; use Facebook\FacebookOtherException; use Facebook\FacebookAuthorizationException; use Facebook\GraphObject; use Facebook\GraphSessionInfo; use Facebook\GraphUser; // Get session variable! session_start(); $output = array( ); // Initialize the app with the app's "secret" and ID. These are private values. FacebookSession::setDefaultApplication( 'xxxxxxxxxxxx','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ); $arg1 = $_SESSION['arg1']; //This is a password variable that tells the script it's being run by an authorized script on the server, not by an outside source. $arg2 = $_SESSION['arg2']; //This is an argument that tells the script what it's supposed to be trying to do. if($arg1 != "whatever"){ echo"Something went wrong; the password variable didn't work."; //The following line is what is -supposed- to happen when this codeblock executes, but we're debugging right now, so we're providing output instead to see what happens in the code. //header("Location: http://www.fantasycs.com/app.php"); }elseif($arg2 == "loginurl"){ echo "It worked! Login URL will be displayed here."; unset($_SESSION['arg2']); unset($_SESSION['arg1']); exit(); } ?> с require_once( 'Facebook/FacebookSession.php' ); require_once( 'Facebook/FacebookRedirectLoginHelper.php' ); require_once( 'Facebook/FacebookRequest.php' ); require_once( 'Facebook/FacebookResponse.php' ); require_once( 'Facebook/FacebookSDKException.php' ); require_once( 'Facebook/FacebookRequestException.php' ); require_once( 'Facebook/FacebookServerException.php' ); require_once( 'Facebook/FacebookOtherException.php' ); require_once( 'Facebook/FacebookAuthorizationException.php' ); require_once( 'Facebook/GraphObject.php' ); require_once( 'Facebook/GraphSessionInfo.php' ); require_once( 'Facebook/GraphUser.php' ); use Facebook\FacebookSession; use Facebook\FacebookRedirectLoginHelper; use Facebook\FacebookRequest; use Facebook\FacebookResponse; use Facebook\FacebookSDKException; use Facebook\FacebookRequestException; use Facebook\FacebookServerException; use Facebook\FacebookOtherException; use Facebook\FacebookAuthorizationException; use Facebook\GraphObject; use Facebook\GraphSessionInfo; use Facebook\GraphUser; // Get session variable! session_start(); $output = array( ); // Initialize the app with the app's "secret" and ID. These are private values. FacebookSession::setDefaultApplication( 'xxxxxxxxxxxx','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ); $arg1 = $_SESSION['arg1']; //This is a password variable that tells the script it's being run by an authorized script on the server, not by an outside source. $arg2 = $_SESSION['arg2']; //This is an argument that tells the script what it's supposed to be trying to do. if($arg1 != "whatever"){ echo"Something went wrong; the password variable didn't work."; //The following line is what is -supposed- to happen when this codeblock executes, but we're debugging right now, so we're providing output instead to see what happens in the code. //header("Location: http://www.fantasycs.com/app.php"); }elseif($arg2 == "loginurl"){ echo "It worked! Login URL will be displayed here."; unset($_SESSION['arg2']); unset($_SESSION['arg1']); exit(); } ?> с require_once( 'Facebook/FacebookSession.php' ); require_once( 'Facebook/FacebookRedirectLoginHelper.php' ); require_once( 'Facebook/FacebookRequest.php' ); require_once( 'Facebook/FacebookResponse.php' ); require_once( 'Facebook/FacebookSDKException.php' ); require_once( 'Facebook/FacebookRequestException.php' ); require_once( 'Facebook/FacebookServerException.php' ); require_once( 'Facebook/FacebookOtherException.php' ); require_once( 'Facebook/FacebookAuthorizationException.php' ); require_once( 'Facebook/GraphObject.php' ); require_once( 'Facebook/GraphSessionInfo.php' ); require_once( 'Facebook/GraphUser.php' ); use Facebook\FacebookSession; use Facebook\FacebookRedirectLoginHelper; use Facebook\FacebookRequest; use Facebook\FacebookResponse; use Facebook\FacebookSDKException; use Facebook\FacebookRequestException; use Facebook\FacebookServerException; use Facebook\FacebookOtherException; use Facebook\FacebookAuthorizationException; use Facebook\GraphObject; use Facebook\GraphSessionInfo; use Facebook\GraphUser; // Get session variable! session_start(); $output = array( ); // Initialize the app with the app's "secret" and ID. These are private values. FacebookSession::setDefaultApplication( 'xxxxxxxxxxxx','xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ); $arg1 = $_SESSION['arg1']; //This is a password variable that tells the script it's being run by an authorized script on the server, not by an outside source. $arg2 = $_SESSION['arg2']; //This is an argument that tells the script what it's supposed to be trying to do. if($arg1 != "whatever"){ echo"Something went wrong; the password variable didn't work."; //The following line is what is -supposed- to happen when this codeblock executes, but we're debugging right now, so we're providing output instead to see what happens in the code. //header("Location: http://www.fantasycs.com/app.php"); }elseif($arg2 == "loginurl"){ echo "It worked! Login URL will be displayed here."; unset($_SESSION['arg2']); unset($_SESSION['arg1']); exit(); } ?> 

И, наконец, app.php:

 <?php session_start(); $_SESSION['arg1'] = "whatever"; $_SESSION['arg2'] = "loginurl"; $output = shell_exec('php-cli test.php Thisworks'); //This runs test.php and $output captures the output properly just fine. No worries. echo $output; $output = shell_exec('php test.php Thisworks'); //This keeps running indefinitely so far as I can tell, and I can't see what's happening because no output is produced. It simply keeps trying to load the page forever. No output is seemingly capture. Bizarre. echo $output; $output = shell_exec('php otherevent.php'); //This has the same problem as when you try to run test.php with the "php" command. It stalls. echo $output; $output = shell_exec('php-cli otherevent.php Thisworks'); //This produces an error on the "use" lines in otherevent.php. It says there's a syntax error on those lines. This has never happened or appeared before; these lines, simply put, do NOT have any errors in them. They've run fine before and have never been changed. As a result of the error, the script is aborted, and no output is captured. echo $output; ?> 

Все, что я хочу в этом примере, это приложение app.php, чтобы иметь возможность выполнить otherevent.php, получить URL-адрес входа (или любой вывод теста, который он выводит), и распечатать URL-адрес входа на экран. Как это сделать? По-видимому, это не так просто, как кажется.

Ваша ошибка с использованием php-cli вокруг ключевых слов «use» приводит меня к выводу, что у вас есть старая версия PHP .. но для решения одной части вашего вопроса я предлагаю не использовать shell_exec для запуска другого PHP-кода. Если вам нужно захватить вывод скрипта, вы можете использовать выходной буфер следующим образом:

 <?php session_start(); $_SESSION['arg1'] = "whatever"; $_SESSION['arg2'] = "loginurl"; // Start capturing the output in a buffer ob_start(); include 'otherevent.php'; // Get the data and close the buffer $output = ob_get_clean(); echo $output; ?> 

Нет никакого смысла в выходном буфере, если вы собираетесь эхо выводить сразу же после этого.

Проверьте свою версию PHP. Для этого SDK требуется 5.4+.