这是一个我正在开发的相当复杂的系统,很难解释为什么我必须以这种方式做事,但对我来说是裸露的。
我有一个包含文件(FileX.php)的应用程序,在某些条件下,它会将iFrame回显到加载跟踪URL(FileY.php)的屏幕。在我直接将FileX.php包含到主页面(FileA.php)的生产环境中,iFrame会回显到屏幕并成功调用FileY.php。
在测试中,我需要调用多个版本的FileA.php,每个版本都包含FileX.php,它输出iFrame来调用FileY.php。我正在使用cURL请求自动执行大量请求。
通过cURL请求加载FileA.php时,它成功完成了FileX.php的include()
,但因为它是通过cURL发生的,所以iFrame永远不会加载它的目的地(FileY.php)。
fileA的cURL请求如下所示:
TestFile.php
// URL
$url = "http://www.mydomain.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.mydomain.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,并且会成功地在iFrame中加载FileY.php。当我通过cURL调用FileA.php时,iFrame不会加载,永远不会调用FileY.php。
我已尝试用echo()
和ob_start()
包装FileX.php中的ob_end_flush()
来强制输出,但这不起作用。我尝试添加sleep(1)
,以防请求发生得太快,没有运气。
是否有cURL选项我可以更改以允许这种情况发生?我无法弄清楚为什么它不会加载iFrame src。
答案 0 :(得分:4)
啊,事实证明我错误地使用了一个选项。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
实际应该是假/ 0。当使用true / 1时,所有输出都通过cURL请求捕获并返回,而不是输出。所以它应该是:
curl_setopt($ ch,CURLOPT_RETURNTRANSFER,0);
我会离开这个而不是删除它,以防它帮助其他人。