我有2个网站,托管在2个不同的服务器。它们是相互关联的。有时我只是在Website-1上做一些事情,然后在Website-2上运行一个脚本。比如我在Website-1上编辑了一些东西,现在我想在Website-2上运行一个脚本,以便在它的服务器上进行相应的更新。
到目前为止,我在网站1上使用了以下代码。
$file = file_get_contents('Website-2/update.php');但这样做的问题是我的网站服务器脚本停止运行,并等待文件返回一些数据。我不想用这些数据做任何事。我只想运行脚本。
有没有办法让我用更好的方式来做这件事,或者告诉PHP转到下一行代码。
发布于 2018-10-06 11:18:19
If you want to call the second site without making your user wait for a response,
I would recommend using a message queue.
Site 1 request would put a message to the queue.
Cron job to check queue and run update on site 2 when message exists.
Common queues apps to look at:
[https://aws.amazon.com/sqs/?nc2=h_m1][1]
[https://beanstalkd.github.io/][2]
[https://www.iron.io/mq][3]
[1]: https://aws.amazon.com/sqs/?nc2=h_m1
[2]: https://beanstalkd.github.io/
[3]: https://www.iron.io/mq发布于 2018-10-06 11:32:26
你想要实现的东西被称为web钩子,应该通过适当的身份验证来实现,这样任何人都不会在任何时候执行你的脚本并使你的服务器超载。
在服务器2上,您需要通过工作线程、线程、消息队列或类似的方式异步执行脚本。
你也可以在你的服务器1上运行异步命令,有很多方法可以做到这一点。这里有一些关于这方面的更多链接。
(https://segment.com/blog/how-to-make-async-requests-in-php/)
发布于 2018-10-06 13:37:20
像往常一样呼叫远程服务器。但是,在您通常调用的PHP脚本中,将所有功能放入第三个脚本中。然后在旧脚本中使用(在Linux上)调用新脚本
exec('php -f "{path to new script}.php" $args > /dev/null &');末尾的&使这成为一个后台或非阻塞调用。因为您是从远程服务器调用它,所以不需要更改调用服务器上的任何内容。php -f运行一个php文件。> /dev/null将该文件的输出发送到垃圾桶。
在windows上,您可以使用COM和WScript.Shell来做同样的事情
$WshShell = new \COM('WScript.Shell');
$oExec = $WshShell->Run('cmd /C php {path to new script}.php', 0, false);您可能希望在文件名和提供的任何参数上使用escapeshellarg。
所以它看起来就像这样
因此,使用您的示例而不是调用:
file_get_contents('Website-2/update.php');你会打电话给
file_get_contents('Website-2/update_kickstart.php');在update_kickstart.php中放入以下代码
<?php
exec('php -f "{path}update.php" > /dev/null &');它将update.php作为单独的后台(非阻塞)调用运行。因为它是非阻塞的,所以update_kickstart.php将完成并返回给searver1,它可以处理自己的事务,而update.php将在server2上独立运行
很简单..。
最后一点是,file_get_contents是一个糟糕的选择。我将使用SSH和可能的PHPSecLib2.0连接到server2,并以只能访问该文件(Chroot it或类似文件)的用户直接运行exec命令。实际上,任何人都可以调用该文件并运行它。由于它位于SSH登录之后,它是受保护的,使用它Chrooted,“特殊”用户只能运行该文件。
https://stackoverflow.com/questions/52675164
复制相似问题