19

HipHop は PHP を C 実行可能ファイルにコンパイルします。PHP エラーはどうなりますか?

デバッグするのは難しいですか?

編集:ドキュメントを調べましたが、何も見つかりませんでした

4

1 に答える 1

29

私はいくつかの簡単なテストを行いました (残念ながら、ヒップホップで遊ぶ時間がありませんでした;-( ) ; ここに私が得た結果があります:



まず、 の内容は次のtest-2.phpとおりです。これには parse error が含まれています。

<?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 のエラー メッセージに含まれていたいくつかの情報が含まれていますが、それほど正確ではありません...

つまり、hiphop でアプリケーションをコンパイルする前に、PHP で試してみることをお勧めします。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 から実行しようとすると、次の 3 つのエラーが発生する可能性が
あります。

まず第一に、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


そのファイルを Hiphop でコンパイルしtest-1.php、Web サーバー モードで実行すると、コンパイル フェーズで次のようになります。これは、問題がないことを意味します。

$ /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


それでは、これら 3 つの 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 のRuntime options wiki ページから判断すると、いくつかのオプションを含む構成ファイルを指定できます。 使用
したコンテンツは次のとおりです。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

もっと情報を入手する必要があります.3 つのリクエストをもう一度試してみましょう。


まず、私が得る呼び出し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 64 ビットで行いました。インストールは非常に簡単でした。

つまり、たとえば、仮想マシンにインストールして、それらを試すことができます。Linux とソフトウェアのコンパイルについて少し知っている限り、hiphop のインストールは不可能な作業ではありません。

于 2010-03-19T05:56:16.810 に答える