1

我有一个应用程序,其中包含一个文件 (FileX.php),该文件在某些​​条件下会在屏幕上回显一个 iFrame,该屏幕会加载一个跟踪 URL (FileY.php)。在我直接将 FileX.php 包含到主页 (FileA.php) 的生产环境中,iFrame 被回显到屏幕上,并且 FileY.php 被成功调用。

不过在测试中,我需要调用多个版本的 FileA.php,每个版本都包含 FileX.php,它输出 iFrame 以调用 FileY.php。我正在使用 cURL 请求自动处理大量请求。

通过 cURL 请求加载 FileA.php 时,它成功地执行了include()FileX.php,但因为它是通过 cURL 发生的,所以 iFrame 永远不会加载它的目标 (FileY.php)。

fileA 的 cURL 请求如下所示:

测试文件.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);

文件A.php:

include_once('FileX.php');

文件X.php:

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

文件Y.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 选项我可以更改以允许这种情况发生?我不知道为什么它不会加载 iFrame src。

4

1 回答 1

6

啊,原来我错误地使用了一个选项。

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

这实际上应该是falseor 0。使用trueor1时,所有输出都通过 cURL 请求捕获并返回,而不是输出。所以应该是:

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