2013-05-10 104 views
0

我有github webhoooks设置为发送POST到我的服务器上的PHP脚本,当我推到回购。 (https://help.github.com/articles/post-receive-hooksGitHub WebHook POSTs不通过

我的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'); 
} 

从日志中,我可以看到,当我把我的回购协议的IP连接,但没有POST数据被记录。我使用RequestBin进行了测试,并确认POST数据存在。此外,如果我手动将一个$ _GET有效负载变量放在URL中,这是记录的(因为我正在检查$ _REQUEST而不是$ _POST)。我的怀疑是我的PHP服务器被配置为拒绝来自其他服务器的POST请求。我使用1and1共享主机,所以我没有专门的控制,但我可以通过SSH进入,并使用.ini文件在本地配置PHP设置。任何建议将不胜感激!

*我不在乎如果我在PHP或其他语言中这样做。如果您认为使用Python或其他方法可能更容易,那也很酷。

-Jeremy

+0

如果你仍然有问题:我在Dreamhost上试过这个代码,没有'file_put_contents',它工作得很好。您可能需要确保1)由于某种原因,您的JSON解码不会失败(因为您只是静静地退出),并且2)您没有权限错误或文件上的某些内容保存。 (我用'mail'替换了'file_put_contents',它工作正常) – 2013-05-12 00:06:35

+0

我怀疑你的服务器拒绝来自其他服务器的请求。如果是这样,那么没有人能够发布任何东西到您的网站。你试过了:'$ json = file_get_contents(“php:// input”);'然后用'$ payload = json_decode($ json)加载json;'' – MBeale 2013-05-14 17:08:25

回答

1

好吧,我想通了,首先做JSON解码之前打印的原始POST数据。原来,我的PHP安装启用了魔术引号,并且在JSON有效内容中的每个引号之前自动放置换码斜杠。显然,这导致JSON无效,并且JSON_decode因此而出错。

下面是简单的解决方法:

$payload = json_decode(stripslashes($_REQUEST['payload'])); 
2

您需要使用下面的代码来获取JSON数据:

$data = json_decode(file_get_contents('php://input')); 

如果你需要一个完整的解决方案;我发现了很少的工具来帮助从Github或Gitlab部署代码,所以我创建了Deepl.io来处理Web-Hooks和调用脚本以部署到您自己的服务器上。 这处理从github或gitlab发送的JSON,可用于多个存储库和分支等。您可以在收到拉取通知后使用自己的PHP或shell脚本,并在每次部署后向您发送状态电子邮件... 查看:http://deepl.io