6

一个月前我开始学习编程。我已经知道 html 和 css,我想我应该学习 PHP。我从教程和书籍中学到了很多,现在我正在制作基于 mysql 的网站进行练习。

我小时候总是玩像 travian 这样的基于浏览器的策略游戏。我在想这些网站是如何运作的。我没有任何问题,直到我意识到关闭浏览器后游戏确实可以运行。例如; 您登录到您的帐户并开始构建并注销。但即使在您关闭浏览器之后,游戏也知道它需要在“x”时间内更新您对该特定建筑物的数据。

有人可以告诉我这是如何工作的吗?是 php 还是 MySQL 或其他编程语言?即使你能告诉我在网上搜索什么,就足够了。

4

3 回答 3

4

尽管是一个喜欢处理陡峭学习曲线的人,但我建议不要尝试跳入需要后台进程的东西,直到你有更多的编程经验。

但无论哪种方式,这都是你需要知道的:

正常的 PHP 进程

PHP 通常的工作方式如下:

  1. 用户在浏览器中输入一个 url 并点击回车(或者只是点击一个链接)
  2. 请求被发送到一堆服务器并神奇地找到正确的网络服务器(超出此答案的范围)
  3. 监听 80 端口的 Apache 或 IIS 等服务器程序抓取请求
  4. Apache 发现请求的页面上有一个 .php 扩展名
  5. Apache 查找是否已将任何处理器分配给 .php 并找到 php.exe
  6. 请求的页面被输入 php.exe
  7. php.exe 为特定用户启动一个新进程,运行脚本上的所有内容,返回其结果
  8. 然后将结果发送回用户
  9. 当用户关闭浏览器并结束“会话”时,由php启动的进程退出

因此,当您想要在后台运行某些东西时遇到的问题是,在大多数情况下,PHP 通常是通过 Web 服务器访问的,因此通常需要浏览器(并且用户通过浏览器发出请求)。而且由于关闭浏览器结束了该过程,因此您需要一种无需浏览器即可运行 php 脚本的方法。

幸运的是,PHP 可以作为服务器上的正常进程在 Web 服务器之外进行访问。但是问题是您必须访问服务器。您可能不希望您的用户通过 ssh 进入您的服务器以手动运行脚本(我假设您也不想每次都代表您的用户手动执行此操作)。因此,您可以选择创建 cronjobs,它会以特定频率自动执行命令,就像您在服务器的命令行中自己键入命令一样。另一种选择是手动启动脚本,除非您的服务器关闭,否则该脚本不会关闭。

基于时间触发脚本:

Cron是 *nix 系统上的任务计划程序和Windows 上的 Windows 任务计划程序。您可以做的是设置一个 cronjob 以特定频率运行特定的 php 文件,并执行您需要从那里运行的所有“后台”任务。

这样做的一种方法是拥有一个 mysql 表,其中包含需要执行的内容以及需要执行的时间。该脚本然后根据时间查询表以检索需要执行的任务,执行它们,然后在 mysql 表中将它们标记为已执行(或只是删除它们)。

这是进程排队的基本形式。

构建队列服务器

这要高级得多,但这里有一个教程,用于创建一个脚本,该脚本将在后台对进程进行排队,而不需要任何外部数据库:在 PHP 中构建队列服务器

让我知道这是否有意义或者您有任何问题:)

于 2013-08-02T08:13:40.933 回答
3

PHP 是一种服务器端语言。任何时候任何人访问服务器上的 PHP 程序,它都会运行,无论谁是客户端。

所以,想象一个拥有计数器的程序。它将其存储在数据库中。每次调用 updatecounter.php 时,计数器都会更新一。

你浏览到 updatecounter.php,它告诉你计数器现在是 34。

下次您浏览 updatecounter.php 时,它会告诉您计数器为 53。

它比您预期的增加了 18 个计数。

这是因为 updatecounter.php 在没有您干预的情况下运行。它是由其他人运行的。

现在,如果您查看 updatecounter.php,您可能会看到如下代码:

 require_once("my_code.php);
 $counterValue = increment_counter_value();
 echo "New Counter Value = ".$counterValue;

请注意,程序的主要核心存储在与您正在调用的程序不同的程序中。

另外,请注意,您可以调用任何东西,而不是调用 increment_counter_value。因此,每当有人浏览 updatecounter.php 或任何您的游戏名称时,都可以运行内部游戏机制。例如,您可以有一个每小时统计管理例程,每次调用它时都会检查它是否在最后一小时内运行过,如果没有,它将执行所有统计信息。

现在,如果没有其他人在玩你的游戏怎么办?如果发生这种情况,那么每小时的统计管理就不会被调用,你的游戏世界就会死掉。因此,您需要做的是创建另一个程序,其唯一功能是运行您的统计信息。然后,您将在服务器上安排该程序以每小时间隔运行。您可以使用称为CRON作业的东西来执行此操作。如果您在 Apache 上,您可能会发现您的主机已经内置了这个工具。我不会详细介绍任务调度,因为在不了解您的环境的情况下不可能给出正确的答案。但基本上,您需要安排一个 PHP 程序在服务器上运行以执行每小时维护。

这是关于 CRON 作业的教程:

http://net.tutsplus.com/tutorials/other/scheduling-tasks-with-cron-jobs/

我自己没有使用过它,但我对 tutsplus 上的其他东西没有任何问题,所以你应该没问题。

于 2013-08-02T07:39:48.543 回答
1

这不仅是 php 。基于浏览器的游戏是 php/mysql/javascript/html 的组合。有很多技术用于此类工作。当你在浏览器上做某事时,比如说添加一个建筑物,一个 ajax 请求被发送到服务器,所以服务器更新数据库(不能等到注销,因为这样其他用户将不知道你的状态来播放(在多方的情况下)。

于 2013-08-02T07:28:20.287 回答