【问题标题】:Why can't a server be controlled without a client?为什么没有客户端就不能控制服务器?
【发布时间】:2017-08-26 03:45:26
【问题描述】:

好吧,服务器已经存在这么多年了,如果我想让一个脚本在我的服务器上每隔 n 秒运行一次,你能做的最好的事情就是给我一个糟糕的 cron 工作?必须有一种内置于编程语言或某种东西的方法,可以让我每隔一段时间运行一个函数或脚本或其他东西,而无需客户端向服务器发送请求。有没有任何语言可以让你做到这一点?节点js?那么大公司如何做服务器维护呢?为什么 php 可以不断地监听请求和 webhook,但无法控制它设计用来控制的东西,而无需其他人发送请求?

【问题讨论】:

  • 我不确定这是一个问题还是一个咆哮。此外,我认为您可能对客户端-服务器架构应该如何工作感到困惑。
  • “一种内置在编程语言中的方法,或者可以让我每隔一段时间运行一个函数或脚本之类的东西”——你的意思是循环吗?是的,大多数编程语言都有这个
  • 无限循环获胜! while(true){ // loopity loop! }
  • 你看起来很沮丧。
  • @E.SK 有时无限循环是保持服务器存活的原因。像 nginx 或 Node.js 这样的服务器基于事件循环的概念。这个循环是无限的。如果不是,那么服务器将停止服务请求,并且 会破坏服务器。

标签: php node.js server client


【解决方案1】:

为什么没有客户端就不能控制服务器?

可以。服务器可以响应客户端发送的请求,但它也可以做其他事情。

好吧,服务器已经存在这么多年了,如果我想让脚本在我的服务器上每 n 秒运行一次,你能做的最好的事情就是给我一个糟糕的 cron 工作?

我不知道是谁这么说你的,但这根本不是真的。即使是 shell 脚本也可以做到这一点。

必须有一种内置于编程语言或其他东西的方法,让我可以在一定间隔内运行函数或脚本或其他东西,而无需客户端向服务器发送请求。

一定有,也有。请参阅下面的示例。

是否有任何语言可以让你做到这一点?

是的,有很多这样的语言。例如,自 1995 年以来,JavaScript 就有 setTimeout()setInterval()

节点js?

是的,Node.js 可以做到这一点以及许多其他事情。由于您专门询问了 Node.js - 以下是您可以使用的一些模块:

事实上还有更多的模块可以处理计划任务。

那么大公司如何做服务器维护呢?

有很多方法可以做到这一点,包括上面提到的那些。有时他们使用 cron,有时他们使用 webhook 和其他 RPC 来编排大量服务器并启动各种任务,有时服务器自己做。在某些情况下,您可以使用流、队列或发布/订阅服务来管理更复杂的场景。

为什么 php 可以不断地侦听请求和 webhook,但无法控制它旨在控制的东西,而无需其他人发送请求?

因为 PHP 不是独立的服务器。您可以将您在 PHP 中编写的内容视为一种请求处理程序。而且您需要请求处理程序来处理请求。

相比之下,用 Node 编写的程序是独立的程序,它们会继续运行,可以在需要的时候做他们想做的事,而且它们只是碰巧响应来自客户端的请求。另一方面,PHP 脚本不是独立的长时间运行的程序,而是由 Apache 或 nginx 等服务器在对特定路径的每个请求时调用,该特定路径由特定 PHP 脚本处理,然后脚本运行,它的服务这个单个请求并完成的工作,如果它发生,以后只会为另一个请求调用。

现在,如果你想有一个定期运行的 PHP 脚本,那么你可以这样做:将脚本放在服务器上,如果你愿意,它只能响应 localhost,并测试它是否每次都运行做例如对http://localhost:1234/script.php 的 POST 请求,如果是,您可以做一些事情来让它按照您的需要每 n 秒运行一次:

(1)你可以把curl -X POST http://localhost:1234/script.php放到crontab里

(2) 你可以这样写一个shell脚本:

#!/bin/sh
while true; do
  curl -X POST http://localhost:1234/script.php
  sleep 10
done

(3) 你可以这样制作一个Node程序:

#!/usr/bin/env node
const request = require('request');
setInterval(() => request.post('http://localhost:1234/script.php'), 10000);

(4) 您可以使用任何其他允许您运行独立程序的语言。

这是让 PHP 脚本定期运行的一种方法。

【讨论】:

  • 你还没有真正回答我的问题。 Javascript是客户端。我需要通过每 x 秒运行一次 php 来完成 cron 作业所做的工作,但没有 cron 作业。我不认为大公司依赖 cron 工作,这似乎不够合法。
  • 本质上,是否有一种服务器端语言不必像您将 php 描述为那样仅充当请求处理程序
  • @E.SK Node.js 是服务器端的,它是 JavaScript。见:nodejs.org
  • ok,那为什么node js可以间隔控制服务器而php不能呢? (没有客户请求)
  • @E.SK 因为用 Node 编写的程序是独立的程序,它们会继续运行,并且可以随心所欲地做他们想做的事,而且它们只是碰巧响应来自客户端的请求。另一方面,PHP 脚本不是独立的长时间运行的程序,而是由 Apache 或 nginx 等服务器在对特定路径的每个请求时调用,该特定路径由特定 PHP 脚本处理,然后脚本运行,它的服务这个单个请求并完成的工作,稍后才会为另一个请求调用。
猜你喜欢
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2013-12-04
  • 1970-01-01
相关资源
最近更新 更多