С HipHop для PHP, что происходит с ошибками PHP

HipHop компилирует PHP в исполняемом файле C. Что происходит с ошибками PHP?

Это более трудно отладить?

редактирование: Я просмотрел документацию, но ничего не нашел

19
задан Matthieu Napoli 10 March 2010 в 13:20
поделиться

1 ответ

Я провел пару быстрых тестов (к сожалению, у меня нет времени поиграть с хип-хопом столько, сколько хотелось бы ;-() ; вот результаты, которые я получил:



Прежде всего, вот содержимое test-2.php , которое содержит ошибку синтаксического анализа:

<?php

echo "what with a parse error ?

Примечание: строка не завершена


Пытаясь запустить это с PHP, я получаю:

$ php test-2.php 
PHP Parse error:  syntax error, unexpected $end, expecting T_VARIABLE or T_DOLLAR_OPEN_CURLY_BRACES or T_CURLY_OPEN in /home/squale/temp/hiphop-php/tests/test-2.php on line 5

Parse error: syntax error, unexpected $end, expecting T_VARIABLE or T_DOLLAR_OPEN_CURLY_BRACES or T_CURLY_OPEN in /home/squale/temp/hiphop-php/tests/test-2.php on line 5


Пытаясь скомпилировать это с помощью hiphop, я получаю:

$ /home/squale/temp/hiphop-php/hiphop-php/src/hphp/hphp test-2.php --keep-tempdir=1 --log=3
running hphp...
creating temporary directory /tmp/hphp_JdsWcU ...
parsing inputs...
parsing ./test-2.php...
parsing inputs took 0'00" (0 ms) wall time
running hphp took 0'00" (154 ms) wall time
Exception: Unable to parse file: ./test-2.php
 (Line: 5, Char: 0): syntax error, unexpected $end

т.е. файл с ошибкой синтаксического анализа не компилируется - что само собой разумеется.

Сообщение об ошибке содержит некоторую информацию, которая присутствовала в ошибке PHP сообщение - но не такое точное ...

Это означает, что вы можете попробовать использовать PHP, прежде чем пытаться скомпилировать приложение с помощью hiphop: сообщение об ошибке, выдаваемое PHP, было более наглядным.



Теперь давайте попробуем с некоторые ошибки / предупреждения во время выполнения; вот содержание test-1.php :

<?php                                                                                                                                                                                                                                                                          

error_reporting(E_ALL);                                                                                                                                                                                                                                                        
ini_set('display_errors', 'On');                                                                                                                                                                                                                                               

if ($_GET['test'] == '1') {                                                                                                                                                                                                                                                    
        $data = (object)array(10);                                                                                                                                                                                                                                             
        echo $data[0];                                                                                                                                                                                                                                                         
} else if ($_GET['test'] == '2') {                                                                                                                                                                                                                                             
        echo 10/0;                                                                                                                                                                                                                                                             
} else if ($_GET['test'] == '3') {                                                                                                                                                                                                                                             
        file_put_contents('/bin/non-allowed', 'hello !');                                                                                                                                                                                                                      
}

echo "plop\n";

При попытке запустить этот файл из Apache + PHP вы получите три возможных ошибки:
(Я скопировал файл в корень своего документа - что означает, что пути для ошибок с Apache не будут одинаковыми)

Прежде всего, вызывая http: //localhost/temp/test-1.php? test = 1 , я получаю:

Fatal error: Cannot use object of type stdClass as array in /home/squale/developpement/tests/temp/test-1.php on line 8

И, попробовав http: //localhost/temp/test-1.php? Test = 2 , я получаю:

Warning: Division by zero in /home/squale/developpement/tests/temp/test-1.php on line 10
plop 

И, наконец, с http: // localhost / temp / test-1.php? test = 3 , я получаю:

Warning: file_put_contents(/bin/non-allowed) [function.file-put-contents]: failed to open stream: Permission denied in /home/squale/developpement/tests/temp/test-1.php on line 12
plop


Теперь компилируем этот test-1.php с помощью hiphop и запуска его в режиме веб-сервера, я получаю это на этапе компиляции, что означает, что все в порядке:

$ /home/squale/temp/hiphop-php/hiphop-php/src/hphp/hphp test-1.php --keep-tempdir=1 --log=3
running hphp...
creating temporary directory /tmp/hphp_xXZ8US ...
parsing inputs...
parsing ./test-1.php...
parsing inputs took 0'00" (1 ms) wall time
pre-optimizing...
pre-optimizing took 0'00" (0 ms) wall time
inferring types...
inferring types took 0'00" (0 ms) wall time
post-optimizing...
post-optimizing took 0'00" (0 ms) wall time
creating CPP files...
creating CPP files took 0'00" (32 ms) wall time
compiling and linking CPP files...

compiling and linking CPP files took 0'39" (39807 ms) wall time
running executable /tmp/hphp_xXZ8US/program --file test-1.php...
plop
all files saved in /tmp/hphp_xXZ8US ...
running hphp took 0'40" (40054 ms) wall time

И затем, запуская сервер:

$ /tmp/hphp_xXZ8US/program -m server -p 8080
Could not mlockall
loading static content...
loading static content took 0'00" (0 ms) wall time
page server started
admin server started
all servers started


Теперь давайте попробуем получить доступ к этим три URL-адреса; сначала вызывая http: // localhost: 8080 / test-1.php? test = 1 Я получаю:

  • В браузере ничего нет
  • Необработанная ошибка: использовался недопустимый тип операнда: не ArrayAccess объекты. в консоли, с которой я запустил сервер

Для http: // localhost: 8080 / test-1.php? Test = 2 , я получаю:

  • В браузере: plop
  • В консоли, из которой я запускал браузер: Деление на ноль

И, наконец, для http: // localhost: 8080 / test-1.php? Test = 3 , получаю:

  • В браузере: plop
  • В консоли: ничего

Здесь тоже индикация ошибок не так хороша, как в PHP .. . по крайней мере, с параметрами по умолчанию ...



Судя по вики-странице параметров времени выполнения hiphop , вы можете указать файл конфигурации, содержащий некоторые параметры.
Вот содержание config.txt Я использовал:

Log {
    Level = Verbose
    NoSilencer = true
    AlwaysLogUnhandledExceptions = true
    RuntimeErrorReportingLevel = 6143
    Header = false
    InjectedStackTrace = true
    NativeStackTrace = true
    MaxMessagesPerRequest = -1
}

ErrorHandling {
    CallUserHandlerOnFatals = true
    NoInfiniteLoopDetection = false
    NoInfiniteRecursionDetection = false
    MaxStackDepth = 1000
    ThrowBadTypeExceptions = true
    ThrowNotices = true
    NoticeFrequency = 1    # 1 out of these many notices to log
    WarningFrequency = 1   # 1 out of these many warnings to log
    AssertActive = false
    AssertWarning = false
  }


Перезапуск сервера, используя переключатель - config , чтобы указать на этот файл:

$ /tmp/hphp_xXZ8US/program -m server -p 8080 --config=config.txt
Could not mlockall
loading static content...
loading static content took 0'00" (0 ms) wall time
page server started
admin server started
all servers started

Мне нужно получить дополнительную информацию ... давайте попробуем еще раз наши три запроса.


Сначала вызывая http: // localhost: 8080 / test-1.php? Test = 1 Я получаю:

  • То же, что и раньше

Для http: // localhost : 8080 / test-1.php? Test = 2 , я получаю:

  • То же, что и раньше

И, наконец, для http: // localhost: 8080 / test-1.php? test = 3 , я получаю:

  • В браузере: plop
  • В консоли: новое сообщение об ошибке, которого я не получал раньше: f_file_put_contents / 316: Разрешение denied


Я больше не пробовал, но игра с этим файлом конфигурации и переключателем - config выглядит интересной идеей; -)



Примечание: я проводил эти тесты на Ubuntu 9.10 64 бита - это официально поддерживаемая система; установка была довольно простой.

Это означает, что вы можете попробовать их, например, выполнив установку на виртуальной машине: если вы немного знаете о Linux и компиляции программного обеспечения, установка hiphop не является невыполнимой задачей.

29
ответ дан 30 November 2019 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: