Синтаксическая ошибка PHP при чтении стандартного ввода


Я создаю скрипт командной строки на PHP, который должен считывать содержимое из STDIN и обрабатывать его в переменную. Он является исполняемым, но результатом является тот же вызов, что и аргумент для команды "php".

Это скрипт, который запускается с помощью крючка события WHM.

Вот файл:

#!/usr/bin/php -q

<?php

$switches = (count($argv) > 1) ? $argv : array();

if (in_array('--describe', $switches)) {
    echo json_encode(describe());
    exit;
} elseif (in_array('--debug', $switches)) {
    list($status, $msg) = debug();
    echo "$status $msg";
    exit;
} else {
    echo '0 myapp/whm.php needs a valid switch';
    exit(1);
}


function getStdInStream()
{
    $input   = fopen('php://stdin', 'r');
    $rawData = '';

    if (is_resource($input)) {
        stream_set_blocking($input, 0);

        while (($line = fgets($input, 1024)) !== false) {
            $rawData .= trim($line);
        }

        fclose($input);
    }

    if ($rawData) {
        $data = json_decode($rawData, true);
    } else {
        $data = array('context'=>array(), 'data'=>array(), 'hook'=>array());
    }

    return $data;
}

function describe()
{
    $debug = array(
        'category' => 'Cpanel',
        'event'    => 'UAPI::Branding::get_application_information',
        'stage'    => 'pre',
        'hook'     => '/usr/local/cpanel/3rdparty/bin/hooktest --debug',
        'exectype' => 'script',
    );
    return array($debug);
}

function debug()
{
    $status = 1;
    $msg = 'Triggered!';

    $input = getStdInStream();

    return array($status, $msg);
}

Выполнение этого в командной строке возвращает сообщение о синтаксической ошибке в строке 24:

$ /usr/local/cpanel/3rdparty/bin/hooktest
<br />
<b>Parse error</b>:  syntax error, unexpected '{' in  <b>/usr/local/cpanel/3rdparty/bin/hooktest</b> on line <b>24</b><br />

Я не вижу ничего неправильного в синтаксисе. Я сделал несколько тестов, таких как комментарий код внутри функции getStdInStream и ошибка исчезает.

Этот сценарий основан на примере, приведенном здесь: https://documentation.cpanel.net/display/SDK/Guide+to+Standardized+Hooks+-+Script+Hook+Action+Code

Пытался комментировать и раскомментировать строку за строкой, и после выполнения fopen ничего не работает.

У вас есть какие-либо идеи, почему я не могу прочитать стандартный ввод, используя этот подход, или это ошибка PHP?

Моя версия PHP:

PHP 5.4.41 (cgi-fcgi) (built: May 22 2015 16:12:44)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
Author: andergmartins, 2015-06-26

1 answers

Только что нашел то, что кажется решением. Изменение хэш-кода с #!/usr/bin/php -q на #!/usr/bin/env php заставило PHP интерпретировать скрипт по-другому.

Я заметил, что при использовании оригинального сценария (из вопроса) глобальные константы STDIN и STDOUT не определены. Использование #!/usr/bin/env php также решает эту проблему.

Согласно справочным страницам для env он запускает программу в измененной среде, вместо того, чтобы "просто" передавать скрипт интерпретатору (в данном случае php). Что заставляет меня думать он правильно перенаправляет stdin и stdout в код скрипта в среде.

 0
Author: andergmartins, 2015-07-08 17:49:09