質問

Eclipse と XDebug を使用して、Web サービスに依存する PHP アプリケーションを開発しています。2 つの方法でサービスを利用するテスト ページがあります。AJAX (jQuery を使用) と cURL。

サービス ページにブレークポイントを追加し、デバッガーを起動します。AJAX からサービスを呼び出すと、実行はブレークポイントで適切に停止し、変数やステップバイステップの制御などを取得します。

しかし、cURLを使用してサービスを呼び出すと(つまり、PHP ページ内から)、ブレークポイントは機能しません。「最初の行で中断」デバッガ オプションをオンにしても、cURL を使用しているときに実行を停止できません。

デバッガーの動作ですか?cURL 呼び出しにリスナーを追加する必要がありますか?URLを変更しますか?それとも XDebug の制限でしょうか?

あなたの時間と努力をありがとう、男

役に立ちましたか?

解決

まだコメントできないので、回答として投稿します。

1 つのセッションで複数の AJAX リクエストをデバッグできますか?cURL を使用してデバッグしようとしたとき、デバッグ セッションは Eclipse でまだ実行中でしたか?

それが私にとってどのように機能するかについての説明:

  1. のみを含む単純な debug.php ファイルでデバッグ セッションを開始します。 <?php 何もありません。最初の行で停止し、「続行」すると実行が終了します。
  2. 次に、cURL (または別のブラウザ) を使用して、パスに ?XDEBUG_SESSION_START=ECLIPSE_DBGP を追加してスクリプトをリクエストします (この追加はオプションだとさえ思います)
  3. スクリプトはデバッグ ビューに最初の行で停止して表示されるはずです。

これがお役に立てば幸いです。

他のヒント

ここでは、ブラウザなしでカールからXdebuggerクライアントをトリガーする方法についてのヒントがあります:

コマンドラインからの1-ます:

curl -H "Cookie: XDEBUG_SESSION=1" http://YOUR-SITE.com/your-script.php

2- PHPから

<?php 
$ch = curl_init ();
curl_setopt ($ch, CURLOPT_URL, 'http://YOUR-SITE.com/your-script.php');
curl_setopt ($ch, CURLOPT_COOKIE, 'XDEBUG_SESSION=1');
curl_exec ($ch);
?>

あなたが添付した場合、それは問題ではありませんので、「XDEBUG_SESSION = 1」URLをカールが、何が必要ですが、要求と一緒に適切なクッキーを送信することです。

私は、これはかなり古いスレッドですけど、私は私が行ったように、私は同じ問題で、それに遭遇する可能性が他の人のための私の経験を投稿しようと思いました。私が発見したことは、あなたが(私はいつもどの)をリモートデバッグする場合、あなたはこの仕事をするためにphp.iniで変更する必要がカップルの設定がある、ということです。ここでは私のために働いたものがあります:

xdebug.remote_connect_back = false
xdebug.remote_host = {client host name or IP}

最初の設定は、「真」は通常で、HTTPリクエストを発信し、同じIPアドレスでクライアントを探すためにはXdebugを伝えます。しかし、この場合、要求はサーバーから来ているので、それは動作しません。代わりに、あなたはどこのクライアントを見つけるためにXdebugをを伝えるために第二の設定を使用する必要があります。これは誰か少し時間を節約することができます願っています!

最も簡単な解決策は、Eclipse上で私のために働いたクッキーのアプローチ-b XDEBUG_SESSION=ECLIPSE_DBGPを使用することで、デバッガをトリガするには、以下を参照してください。

curl  -H 'Content-type: application/json' \
      -b XDEBUG_SESSION="ECLIPSE_DBGP" \
      -X POST \
      -d '{"uid":200, "message":"asdsad","message_type":1}' 
      http://daxuebao.local:8083/api/message/send

Ajax リクエストをデバッグする場合、そのリクエストはブラウザによって、他のリクエストと同じナビゲーション コンテキストで送信されます。 (Ajax 以外) リクエスト -- これが正常に動作する理由です。


curl によって送信されたリクエストは、別の異なるコンテキスト内にあります。デバッガーをそこにフックできるかどうかはわかりません... だけど、たぶん...

まず、参考になりそうな情報を引用します。 Xdebug のドキュメント :

XDebugには、ブラウザを介して開始されたときにデバッグセッションを追跡する機能が含まれています。クッキー。これは次のように機能します:

  • URL 変数の場合 XDEBUG_SESSION_START=name URLに追加されますxdebugは名前のクッキーを発します」XDEBUG_SESSION「そして価値としての価値 XDEBUG_SESSION_STARTURLパラメータ。
  • GET(またはPOST)変数がある場合 XDEBUG_SESSION_START または XDEBUG_SESSION Cookieが設定されており、XdebugはDebugClientに接続しようとします。
  • デバッグセッションを停止する(およびCookieを破壊する)URLパラメーターを追加するだけです XDEBUG_SESSION_STOP。Xdebugは、DebugClientに接続しようとしなくなります。

おそらく、その cookie を「手動で」設定し、curl リクエストに沿って送信すれば、うまくいくかもしれません...

デバッグ セッションの開始時に Xdebug によって設定された値を最初に取得する必要があると思いますが、ブラウザーにある Cookie を再利用することは可能なはずです。

注記 :これは試したことはありませんが、試してみてうまくいった場合は、うまくいったことを確認してもらえますか?

私はこの全く同じ問題に遭遇しました。私は、php.iniののオフの自動起動機能を回すことによってそれを解決します:

xdebug.remote_autostart = 0

、その後、私のWebサービスクライアントが呼び出すWebサービスのURLにAPIキーを追加

?XDEBUG_SESSION_START=<your API key here>

これは重要、しかし、私は私のデバッガ(MacGDBp)にAPIキーを入力した場合、私はわかりません。今、デバッガは、クライアントが開始されていないとき、weberviceサーバー側のスクリプトが呼び出されたときにのみ、最大発射します。

この情報がお役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top