HipHop компилирует PHP в исполняемый файл C. Что происходит с ошибками PHP?
Сложнее ли отлаживать?
edit: я просмотрел документацию, но ничего не нашел
HipHop компилирует PHP в исполняемый файл C. Что происходит с ошибками PHP?
Сложнее ли отлаживать?
edit: я просмотрел документацию, но ничего не нашел
Я сделал пару быстрых тестов (у меня нет времени играть с хип-хопом столько, сколько хотелось бы, к сожалению;-(), вот результаты, которые я получил:
Прежде всего, здесь содержимое 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 не является невыполнимой задачей.