Подтвердить что ты не робот

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

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

Сложнее ли отлаживать?

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

4b9b3361

Ответ 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 Я получаю:

  • Ничего в браузере
  • Unhandled error: Invalid operand type was used: not ArrayAccess objects. в консоли, с которой я запустил сервер

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

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

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

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

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



Судя по hiphop странице вики-версии Vista, вы можете указать файл конфигурации, содержащий некоторые параметры.
Здесь содержимое 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: Permission denied


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



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

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