在其他服务器上运行脚本

时间:2018-10-06 02:19:30

标签: php

我有2个网站,分别托管在2个不同的服务器上。它们是相互联系的。有时,我只是在Website-1上做一些事情,然后在Website-2上运行脚本。就像我在Website-1上进行了一些编辑,现在我想在Website-2上运行一个脚本以在其服务器上进行相应的更新。

到目前为止,我正在网站1上使用以下代码。

$file = file_get_contents('Website-2/update.php');

但是问题是我的Website-1服务器脚本停止运行并等待文件返回一些数据。而且我不想对该数据做任何事情。我只是想运行脚本。

有没有一种方法可以更好地完成此操作,或者告诉PHP移至下一行代码。

3 个答案:

答案 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上运行异步命令。有多种方法可以实现此目的。这里有一些与此有关的链接。

Async curl request in PHP

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

所以看起来像这样

  • Server1调用Server2
  • 被调用(在Server2上)的脚本运行exec并启动后台作业(Server2),然后退出
  • Server1继续正常运行
  • Server2继续后台进程

因此,使用您的示例而不是调用:

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登录名对其进行保护,并对其进行加密,使“特殊”用户只能运行一个文件。

相关问题