Я сделал пару быстрых тестов (к сожалению, у меня нет времени играть в хип-хоп столько, сколько хотелось бы ;-() ; вот результаты, которые я получил:
Прежде всего, вот содержимое 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
Пытаясь скомпилировать это с хип-хопом, я получаю:
$ /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 ... по крайней мере, с параметрами по умолчанию ...
Судя по вики-странице хип-хопа Опции времени выполнения , вы можете указать файл конфигурации, содержащий некоторые опции.
Вот содержимое 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
выглядит интересной идеей; -)
Примечание. Я провел эти тесты на 64-битной Ubuntu 9.10 - официально поддерживаемой системе; установка была довольно простой.
Это означает, что вы можете попробовать их, например, выполнить установку на виртуальной машине: если вы немного знакомы с Linux и компиляцией программного обеспечения, установка hiphop не является невозможной задачей.