【发布时间】:2011-03-20 16:22:52
【问题描述】:
我想将请求变量转储到文件中以进行调试。这怎么可能?
【问题讨论】:
标签: php
我想将请求变量转储到文件中以进行调试。这怎么可能?
【问题讨论】:
标签: php
<?php
$req_dump = print_r($_REQUEST, TRUE);
$fp = fopen('request.log', 'a');
fwrite($fp, $req_dump);
fclose($fp);
未经测试但应该可以完成这项工作,只需将 request.log 更改为您要写入的文件即可。
【讨论】:
var_export($var,true)。
fwrite($fp, '['.date("c").']'.$req_dump."\n");。这样,当我tail -f该文件时,我得到一个日期/时间戳。
我认为现在这种方法更简单快捷:
$req_dump = print_r($_REQUEST, true);
$fp = file_put_contents('request.log', $req_dump, FILE_APPEND);
【讨论】:
file_put_contents( 'request.log', $req_dump, FILE_APPEND)
$fp 变量?
true 或false 值,具体取决于操作是否成功。
使用serialize() 函数进行转储。分别转储$_SERVER、$_COOKIE、$_POST 和$_GET(可能转到同一个文件)。如果您计划使用数据进行调试,了解数据是 POST 请求还是 GET 请求的一部分会有所帮助。
转储所有内容有利于在开发中进行调试,但在生产中则不然。如果您的应用程序没有很多用户,它也可以在生产环境中工作。如果您预计会有很多用户,请考虑仅转储 $_POST 数据,或将服务器变量限制为以 HTTP_ 开头的变量。
【讨论】:
/* may be late but he can help others.
it's not my code, I get it from :
https://gist.github.com/magnetikonline/650e30e485c0f91f2f40
*/
class DumpHTTPRequestToFile {
public function execute($targetFile) {
$data = sprintf(
"%s %s %s\n\nHTTP headers:\n",
$_SERVER['REQUEST_METHOD'],
$_SERVER['REQUEST_URI'],
$_SERVER['SERVER_PROTOCOL']
);
foreach ($this->getHeaderList() as $name => $value) {
$data .= $name . ': ' . $value . "\n";
}
$data .= "\nRequest body:\n";
file_put_contents(
$targetFile,
$data . file_get_contents('php://input') . "\n"
);
echo("Done!\n\n");
}
private function getHeaderList() {
$headerList = [];
foreach ($_SERVER as $name => $value) {
if (preg_match('/^HTTP_/',$name)) {
// convert HTTP_HEADER_NAME to Header-Name
$name = strtr(substr($name,5),'_',' ');
$name = ucwords(strtolower($name));
$name = strtr($name,' ','-');
// add to list
$headerList[$name] = $value;
}
}
return $headerList;
}
}
(new DumpHTTPRequestToFile)->execute('./dumprequest.txt');
// add this line at the end to create a file for each request with timestamp
$date = new DateTime();
rename("dumprequest.txt", "dumprequest" . $date->format('Y-m-d H:i:sP') . ".txt");
【讨论】: