在shell脚本中使用PHP的HTML输出。
在shell脚本中使用PHP的HTML输出。
我有一个创建大型复杂表格的PHP脚本。我正试图设置一个shell脚本,该脚本将接受一个ID作为参数,然后使用该ID运行PHP脚本,并接受PHP脚本的HTML输出,用作cURL POST到DocRaptor以生成PDF的一部分。\n示例shell脚本如下,我希望document_content是我生成的HTML。\n
myHTML = usr/bin/php mytablemaker.php?id=$1 curl -H "Content-Type:application/json" -d'{"user_credentials":"API_KEY", "doc":{"name":"docraptor_sample.pdf", "document_type":"pdf", "test":"true", "document_content":"myHTML"}}' http://docraptor.com/docs > docraptor_sample.pdf
\n请问我应该如何正确操作?
问题的出现原因是代码中缺少一个名为document_url的参数,但是DocRaptor的错误信息中提到了这个参数。
解决方法是根据来自hakre和anttix的经验,使用以下代码:
curl -H "Content-Type:application/json" -d'{"user_credentials":"API_KEY", "doc":{"name":"docraptor_sample.pdf", "document_type":"pdf", "test":"false", "document_url":"'"http://foo.com/tablemaker.php?CTN=$1"'"}}' http://docraptor.com/docs -o docraptor_sample.pdf
然后,文中提到了一个关于删除以myHTML=开头的那行代码的问题,如果删除这行代码,脚本是否仍然能正常工作。答案是可以,这样做可以节省内存。
最后,作者表示自己被老板调走了,不再继续这个项目,老板决定使用一个屏幕捕捉服务,并提供JPEG而不是PDF。作者表示自己没有好好注意,将从答案中删除相关内容。
问题的原因是PHP脚本(mytablemaker.php)在命令行使用时无法输出HTML内容,只能在Web页面中显示。解决方法是修改mytablemaker.php脚本,使其能够根据命令行参数或GET请求参数来获取id,并输出HTML内容。然后,在Bash脚本中使用PHP命令获取HTML内容,并对字符串中的引号和反斜杠进行转义以符合JSON规范。最后,将HTML内容作为参数发送给服务器。
具体的解决方法如下:
首先,在mytablemaker.php脚本中添加以下代码,以判断是通过命令行参数还是GET请求参数来获取id:
if(isset($argv[1])) { $id=$argv[1]; } else { $id=$_GET["id"]; }
然后,在Bash脚本中使用以下命令获取HTML内容,并对字符串中的引号和反斜杠进行转义:
myHTML=$(/usr/bin/php -f mytablemaker.php $1 | sed -e 's/[\\"]/\\&/g')
接下来,将HTML内容作为参数发送给服务器,可以使用curl命令,命令如下:
curl -H "Content-Type:application/json" -d'{"user_credentials":"API_KEY", "doc":{"name":"docraptor_sample.pdf", "document_type":"pdf", "test":"true", "document_content":"'"$myHTML"'"}}' http://docraptor.com/docs -o docraptor_sample.pdf
需要注意的是,在最后一行的字符串拼接中,使用了单引号和双引号进行拼接,以保证变量$myHTML的值能够正确地被解析。
如果在使用过程中遇到问题,可以在PHP脚本中添加echo "$myHTML"语句,以便查看HTML内容是否正确获取。
通过以上方法,可以解决PHP脚本在命令行使用时无法输出HTML内容的问题,并将HTML内容作为参数发送给服务器。
问题的原因是在shell脚本中使用了PHP的HTML输出作为变量,但是没有正确处理HTML中的特殊字符,导致脚本无法正常执行。解决方法是使用PHP的json_encode函数对HTML进行编码,或者使用addcslashes函数对HTML中的特殊字符进行转义。
具体的解决方法如下:
myHTML = $(usr/bin/php mytablemaker.php?id=$1) curl -H "Content-Type:application/json" -d'{"user_credentials":"API_KEY", "doc":{"name":"docraptor_sample.pdf", "document_type":"pdf", "test":"true", "document_content":"'"$myHTML"'"}}' http://docraptor.com/docs > docraptor_sample.pdf
此外,还可以参考以下链接了解更多相关信息:
- [Bash Scripting: Redirect output into variable](https://stackoverflow.com/q/5701653/367456)
- [json.org](http://json.org)
- [json_encode](http://php.net/json_encode)
- [addcslashes](http://php.net/addcslashes)
- [ob_get_clean](http://php.net/ob_get_clean)
注意,如果要将GET变量传递给命令行PHP解释器,需要使用CGI版本的PHP解释器。另外,使用类似`a = "value"`的方式在shell中赋值会导致命令找不到的错误。