Используя PHP версию 5.4.28, я пытаюсь выполнить следующее:
У приложения facebook у меня есть скрипт «otherevent.php». Он не должен быть общедоступным для любого пользователя. Это бэкэнд-приложение, которое находится на веб-сервере, из-за того, что Facebook требует, чтобы у него был веб-адрес, а приложение запускалось и управлялось другими скриптами.
Первый скрипт, который я должен запускать и управлять приложением, называется «app.php». В идеале все, что он должен сделать, это выполнить «otherevent.php», получить вывод и эхо выводить на экран.
Безумие возникает в виде «неожиданных T_STRING, ожидающих ошибок T_CONSTANT_ENCAPSED_STRING», среди прочего.
У меня есть комментарии и код для трех тестовых файлов: «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+.