1

特定の条件下で、トラッキングURL(FileY.php)をロードする画面にiFrameをエコーするファイル(FileX.php)を含むアプリケーションがあります。FileX.phpをメインページ(FileA.php)に直接インクルードする実稼働環境では、iFrameが画面にエコーされ、FileY.phpが正常に呼び出されます。

ただし、テストでは、FileY.phpを呼び出すためにiFrameを出力するFileX.phpをそれぞれ含むFileA.phpの複数のバージョンを呼び出す必要があります。私はcURLリクエストを使用してこの多数のリクエストを自動化しています。

cURLリクエストを介してFileA.phpをロードするとinclude()、FileX.phpの処理は正常に実行されますが、cURLを介して実行されるため、iFrameは宛先(FileY.php)をロードしません。

fileAのcURLリクエストは次のようになります。

TestFile.php

// URL
$url = "http://www.example.com/FileA.php";

// New Cookie file
$ckfile = tempnam("/tmp", "CURLCOOKIE");

// New Connection
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile);  
curl_setopt($ch, CURLOPT_COOKIESESSION, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_exec($ch);
curl_close($ch);

FileA.php:

include_once('FileX.php');

FileX.php:

echo("<iframe src='http://www.example.com/FileY.php' width='0' height='0'></iframe>");

FileY.php

// Contains logging stuff to log the fact that FileY.php was called.

私が言ったように、ブラウザでFileA.phpを直接呼び出すと、FileX.phpが含まれ、FileY.phpがiFrameに正常にロードされます。cURLを介してFileA.phpを呼び出すと、iFrameが読み込まれず、FileY.phpが呼び出されることはありません。

echo()FileX.phpでとをラップして出力を強制しようとしましたがob_start()、うまくいきob_end_flush()ませんでした。sleep(1)リクエストが速すぎて運が悪かった場合に備えて、を追加してみました。

これを可能にするために変更できるcURLオプションはありますか?iFramesrcが読み込まれない理由がわかりません。

4

1 に答える 1

6

ああ、それで私はオプションを間違って使用していたことがわかりました。

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

これは実際にはまたはである必要がありfalseます0trueまたはを使用する1と、すべての出力がキャッチされ、出力されるのではなく、cURLリクエストを介して返されます。したがって、次のようになります。

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
于 2012-10-31T15:16:14.730 に答える