我有2个网站,分别托管在2个不同的服务器上。它们是相互联系的。有时,我只是在Website-1上做一些事情,然后在Website-2上运行脚本。就像我在Website-1上进行了一些编辑,现在我想在Website-2上运行一个脚本以在其服务器上进行相应的更新。
到目前为止,我正在网站1上使用以下代码。
$file = file_get_contents('Website-2/update.php');
但是问题是我的Website-1服务器脚本停止运行并等待文件返回一些数据。而且我不想对该数据做任何事情。我只是想运行脚本。
有没有一种方法可以更好地完成此操作,或者告诉PHP移至下一行代码。
答案 0 :(得分:0)
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
答案 1 :(得分:0)
您要实现的目标称为Web钩子,应使用适当的身份验证来实现,以使没有人可以随时执行您的脚本并使服务器超载。
在服务器2上,您需要通过工作线程,线程,消息队列或类似对象异步执行脚本。
您还可以在服务器1上运行异步命令。有多种方法可以实现此目的。这里有一些与此有关的链接。
(https://segment.com/blog/how-to-make-async-requests-in-php/)
答案 2 :(得分:-1)
正常呼叫您的远程服务器。但是,通常在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并直接与只能访问该文件(将其根目录化或类似)的用户一起运行exec命令。因为它是任何人都可以调用该文件并运行它。通过SSH登录名对其进行保护,并对其进行加密,使“特殊”用户只能运行一个文件。