在 PHP 中发送 HTTP GET 请求(不要 Return 目标 URL 的内容,只是执行它)
Send HTTP GET Request in PHP (Don't Return Target URL's Contents, Just Execute It)
我一直在与 PHP 中的一个非常奇怪的场景作斗争。我有一个创建一些 HTML(包括 google 图)的主脚本。但是它有一些 <SCRIPT>
标签不会被 MPDF 库呈现。所以这就是我所做的:
创建了一个新文件g_chart.php
并在其中包含了所有图形生成代码,如下所示:
<meta charset="UTF-8">
<script>
var save_as_file = '<?php echo $_GET['file']; ?>';
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript" src="http://canvg.googlecode.com/svn/trunk/rgbcolor.js"></script>
<script type="text/javascript" src="http://canvg.googlecode.com/svn/trunk/canvg.js"></script>
<script>
google.load('visualization', '1', {packages: ['corechart', 'bar']});
google.setOnLoadCallback(drawBasic);
function drawBasic() {
var data = google.visualization.arrayToDataTable([
['City', '2010 Population',],
['حواس', 8175000],
['انسانی جسم کے حصوں کے نام اور افعال', 3792000],
['Chicago, IL', 2695000],
['Houston, TX', 2099000],
['صوتیات : ہجے اور الفاظ', 1526000]
]);
var options = {
title: 'Population of Largest U.S. Cities',
chartArea: {width: '50%'},
hAxis: {
title: 'Total Population',
minValue: 0
},
vAxis: {
title: 'City'
}
};
var chart = new google.visualization.BarChart(document.getElementById('chart_div'));
google.visualization.events.addListener(chart, 'ready', function () {
chart_div.innerHTML = '<img src="' + chart.getImageURI() + '">';
});
chart.draw(data, options);
var img_src = $('#chart_div img').attr('src');
$('#chart_div').after('<form name="frm_img"><input type="hidden" name="img_src" value="'+img_src+'"></form>');
SaveToDisk();
}
function SaveToDisk() {
var oform = $('form[name="frm_img"]');
var datastring = oform.serialize();
$.ajax({
type : "POST",
url : "g_chart_save.php?file="+save_as_file,
data : datastring,
cache : false,
async : true,
success : function(html){
}
});
}
</script>
<div id="chart_div"></div>
g_chart_save.php文件如下:
<?php
if (!empty($_POST)) {
$img_src = $_POST['img_src'];
$file = $_GET['file'];
$image = base64_to_jpeg( $img_src, $file.'.png' );
}
function base64_to_jpeg($base64_string, $output_file) {
$ifp = fopen($output_file, "wb");
$data = explode(',', $base64_string);
fwrite($ifp, base64_decode($data[1]));
fclose($ifp);
return $output_file;
}
?>
所以基本上,当我在浏览器中调用 g_chart.php?file=graph
时。我的图形已生成并保存到与物理 graph.png
文件相同的目录中。
通过创建上述解决方法,我现在必须从我的主脚本的 PHP 文件中调用这个图形生成脚本 g_chart.php?file=graph
(在它正在执行时,即运行时)。
我使用了以下方法来实现它:
- CURL
- 打开
- file_get_contents
- stream_context_create
- HttpRequest
每次我使用上述任何方法时,它都会命中目标文件 g_chart.php
但它实际上并没有执行它,而是 returns 我在目标文件中编写的内容或代码文件。
我希望它以静默方式执行,以便创建图表的图像文件,然后我可以将其包含在我的 PDF 中。
请记住,稍后我将在 GET 请求中将我的图形数据传递到目标文件,以使其动态化。
如有任何帮助,我们将不胜感激。
由于您描述的过程依赖于客户端 Javascript 才能执行,因此这种方法将行不通。 Curl 和其他各种通过 http 访问文档的方法只能做到这一点。
不过,您也许可以使用 The PhantomJS headless Webkit scriptable 来获得所需的结果。使用它,您可能可以编写脚本来提取图形图像,而无需使用 PHP.
将其发回网络服务器
我一直在与 PHP 中的一个非常奇怪的场景作斗争。我有一个创建一些 HTML(包括 google 图)的主脚本。但是它有一些 <SCRIPT>
标签不会被 MPDF 库呈现。所以这就是我所做的:
创建了一个新文件g_chart.php
并在其中包含了所有图形生成代码,如下所示:
<meta charset="UTF-8">
<script>
var save_as_file = '<?php echo $_GET['file']; ?>';
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript" src="http://canvg.googlecode.com/svn/trunk/rgbcolor.js"></script>
<script type="text/javascript" src="http://canvg.googlecode.com/svn/trunk/canvg.js"></script>
<script>
google.load('visualization', '1', {packages: ['corechart', 'bar']});
google.setOnLoadCallback(drawBasic);
function drawBasic() {
var data = google.visualization.arrayToDataTable([
['City', '2010 Population',],
['حواس', 8175000],
['انسانی جسم کے حصوں کے نام اور افعال', 3792000],
['Chicago, IL', 2695000],
['Houston, TX', 2099000],
['صوتیات : ہجے اور الفاظ', 1526000]
]);
var options = {
title: 'Population of Largest U.S. Cities',
chartArea: {width: '50%'},
hAxis: {
title: 'Total Population',
minValue: 0
},
vAxis: {
title: 'City'
}
};
var chart = new google.visualization.BarChart(document.getElementById('chart_div'));
google.visualization.events.addListener(chart, 'ready', function () {
chart_div.innerHTML = '<img src="' + chart.getImageURI() + '">';
});
chart.draw(data, options);
var img_src = $('#chart_div img').attr('src');
$('#chart_div').after('<form name="frm_img"><input type="hidden" name="img_src" value="'+img_src+'"></form>');
SaveToDisk();
}
function SaveToDisk() {
var oform = $('form[name="frm_img"]');
var datastring = oform.serialize();
$.ajax({
type : "POST",
url : "g_chart_save.php?file="+save_as_file,
data : datastring,
cache : false,
async : true,
success : function(html){
}
});
}
</script>
<div id="chart_div"></div>
g_chart_save.php文件如下:
<?php
if (!empty($_POST)) {
$img_src = $_POST['img_src'];
$file = $_GET['file'];
$image = base64_to_jpeg( $img_src, $file.'.png' );
}
function base64_to_jpeg($base64_string, $output_file) {
$ifp = fopen($output_file, "wb");
$data = explode(',', $base64_string);
fwrite($ifp, base64_decode($data[1]));
fclose($ifp);
return $output_file;
}
?>
所以基本上,当我在浏览器中调用 g_chart.php?file=graph
时。我的图形已生成并保存到与物理 graph.png
文件相同的目录中。
通过创建上述解决方法,我现在必须从我的主脚本的 PHP 文件中调用这个图形生成脚本 g_chart.php?file=graph
(在它正在执行时,即运行时)。
我使用了以下方法来实现它:
- CURL
- 打开
- file_get_contents
- stream_context_create
- HttpRequest
每次我使用上述任何方法时,它都会命中目标文件 g_chart.php
但它实际上并没有执行它,而是 returns 我在目标文件中编写的内容或代码文件。
我希望它以静默方式执行,以便创建图表的图像文件,然后我可以将其包含在我的 PDF 中。
请记住,稍后我将在 GET 请求中将我的图形数据传递到目标文件,以使其动态化。
如有任何帮助,我们将不胜感激。
由于您描述的过程依赖于客户端 Javascript 才能执行,因此这种方法将行不通。 Curl 和其他各种通过 http 访问文档的方法只能做到这一点。
不过,您也许可以使用 The PhantomJS headless Webkit scriptable 来获得所需的结果。使用它,您可能可以编写脚本来提取图形图像,而无需使用 PHP.
将其发回网络服务器