【发布时间】:2013-05-10 13:53:26
【问题描述】:
我已经设置了 github webhooooks,以便在我推送到存储库时将 POST 发送到我服务器上的 PHP 脚本。 (https://help.github.com/articles/post-receive-hooks)
我的 PHP 脚本记录连接 IP,以及收到的有效负载:
$date = strftime('%c');
file_put_contents('log.txt', PHP_EOL.trim($date).PHP_EOL, FILE_APPEND);
try
{
$payload = json_decode($_REQUEST['payload']);
}
catch(Exception $e)
{
exit(0);
}
//LOG THE POST REQUEST
file_put_contents('log.txt', print_r($payload, TRUE), FILE_APPEND);
//EXECUTE A SCRIPT WHEN THE POST REQUEST IS INITIALIZED
if ($payload->ref === 'refs/heads/master')
{
exec('deploy.sh >> log.txt');
}
从日志中,我可以看到当我推送到我的 repo 时连接了一个 IP,但没有记录任何 POST 数据。我使用 RequestBin 进行了测试,并确认存在 POST 数据。此外,如果我在 URL 中手动放置一个 $_GET 有效负载变量,则会记录下来(因为我正在检查 $_REQUEST 而不仅仅是 $_POST)。我怀疑我的 PHP 服务器被配置为拒绝来自其他服务器的 POST 请求。我正在使用 1and1 共享主机,所以我没有专门的控制,但我可以通过 SSH 登录,也可以使用 .ini 文件在本地配置 PHP 设置。任何建议将不胜感激!
*我不在乎我是用 PHP 还是其他语言来做这件事。如果您认为使用 Python 或其他东西可能会更容易,那也很酷。
-杰里米
【问题讨论】:
-
如果您仍然遇到问题:我在 Dreamhost 上尝试了这段代码,没有
file_put_contents,它工作得很好。您可能需要确保 1) JSON 解码不会因某种原因而失败(因为您只是静默退出),以及 2) 您没有权限错误或文件上的某些内容自行保存。 (我用mail替换了file_put_contents,效果很好) -
我怀疑您的服务器拒绝来自其他服务器的发布请求。如果是这样,那么没有人可以在您的网站上发布任何内容。你试过吗:
$json = file_get_contents ("php://input");然后用$payload = json_decode($json);加载json
标签: php post github git-post-receive