在 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(在它正在执行时,即运行时)。

我使用了以下方法来实现它:

  1. CURL
  2. 打开
  3. file_get_contents
  4. stream_context_create
  5. HttpRequest

每次我使用上述任何方法时,它都会命中目标文件 g_chart.php 但它实际上并没有执行它,而是 returns 我在目标文件中编写的内容或代码文件。

我希望它以静默方式执行,以便创建图表的图像文件,然后我可以将其包含在我的 PDF 中。

请记住,稍后我将在 GET 请求中将我的图形数据传递到目标文件,以使其动态化。

如有任何帮助,我们将不胜感激。

由于您描述的过程依赖于客户端 Javascript 才能执行,因此这种方法将行不通。 Curl 和其他各种通过 http 访问文档的方法只能做到这一点。

不过,您也许可以使用 The PhantomJS headless Webkit scriptable 来获得所需的结果。使用它,您可能可以编写脚本来提取图形图像,而无需使用 PHP.

将其发回网络服务器