С HipHop для PHP, что происходит с ошибками PHP - PullRequest
19 голосов
/ 10 марта 2010

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

Это сложнее отладить?

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

1 Ответ

29 голосов
/ 19 марта 2010

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



Прежде всего, вот содержимое 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 не является невозможной задачей.

...