PHP 作为 FastCGI 应用程序运行 (php-cgi) - 如何发出并发请求?

2023-11-23

编辑:更新 - 向下滚动
编辑2:更新-问题已解决


Some background information:

我正在用 Java 编写自己的网络服务器,几天前我询问 Apache 与 PHP 的接口到底如何,这样我就可以实现 PHP 支持。我了解到 FastCGI 是最好的方法(因为 mod_php 不是一个选项)。因此,我查看了 FastCGI 协议规范,并设法为我的服务器编写了一个可用的 FastCGI 包装器。我已经测试了 phpinfo() 并且它有效,事实上所有 PHP 函数似乎都工作得很好(发布数据、会话、日期/时间等)。

我的网络服务器能够同时服务请求(即用户1可以在用户2请求some_large_binary_file.zip的同时检索file1.html),它通过为每个用户请求生成一个新的Java线程(在完成或用户与客户端的连接时终止)来实现这一点取消)。

但是,它无法同时处理 2 个(或更多)FastCGI 请求。它的作用是,将它们排队,因此当请求 1 完成后,它立即开始处理请求 2。我用 2 个 PHP 页面对此进行了测试,一个包含 sleep(10),另一个包含 phpinfo()。

我将如何处理多个请求,因为我知道它可以完成(IIS 下的 PHP 作为 FastCGI 运行,它可以很好地处理多个请求)。

更多信息:

我在 Windows 下编码,用于执行 php-cgi.exe 的批处理文件包含:

set PHP_FCGI_CHILDREN=8
set PHP_FCGI_MAX_REQUESTS=500
php-cgi.exe -b 9000

但它不会产生 8 个子级,服务在 500 个请求后就会终止。

我已经做了研究并从维基百科:

处理多个请求 同时通过以下方式实现 使用单个连接 内部复用(即多个 通过单个连接的请求) 和/或通过使用多个连接

现在显然多个连接对我不起作用,因为每次客户端请求涉及 FastCGI 的内容时,它都会为 FastCGI 应用程序创建一个新套接字,但它不能同时工作(而是将它们排队)。

我知道同一连接下 FastCGI 请求的内部多路复用是通过使用不同的地址发出每个唯一的 FastCGI 请求来完成的。请求ID。 (另请参阅“通信协议”标题的最后 3 段本文).

我还没有测试过这一点,但我将如何实施呢?我认为我需要某种 FastCGI Java 线程,其中包含某种 Map 和一个静态函数,我可以用它来添加请求。然后,在线程的 run() 函数中,它将有一个 while 循环,并且对于每个循环,它将检查 Map 是否包含新请求,如果包含,它将为它们分配一个请求 ID 并将它们写入 FastCGI 流。然后等待输入等等,正如你所看到的,这变得太复杂了。

有谁知道这样做的正确方法?或者有什么想法吗?非常感谢。

请注意,如果需要,我可以提供 FastCGI 包装器的代码。


Update:

基本上,我下载了 nginx 并将其设置为使用 PHP 作为 FastCGI 应用程序,它也遇到了与我的服务器相同的问题。它无法处理并发 PHP 请求。这让我相信我的代码实际上是正确的。所以 PHP 有问题或者我没有正确设置它。也许是因为我使用的是Windows,因为一些lighttpd用户声称Windows无法正确处理FastCGI(这没有多大意义)。我将很快安装 Linux 并报告任何进展。


好的,我设法找到了问题的原因。这根本不是我的代码。它是 PHP,当以 FastCGI 模式运行时,它不能在 Windows 下生成额外的 php-cgi,在 Linux 下它工作得很好,我只是将我的服务器指向我的 linux 盒子 IP,它在并发 FCGI 请求时没有问题。糟糕,但我想事情就是这样……

之后我深入研究了PHP源代码,发现响应PHP_FCGI_CHILDREN的代码部分已经被#ifndef WIN32封装了,所以开发人员必须意识到这个问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 作为 FastCGI 应用程序运行 (php-cgi) - 如何发出并发请求? 的相关文章

  • 使用 Ajax 和 PHP 上传图像

    我想将图像上传到我的服务器 并控制 HTML 代码中的 PHP 回显 为此 我想使用 jQuery Ajax 但我不知道如何使用 Ajax 将图像发送到 PHP 这是一个大学项目 所以我不能使用任何类型的插件 我的实际代码 HTML
  • Yii 添加条件

    我尝试根据我的条件从表中获取行 我的代码 conditions array id gt array 148028 118508 criteria new CDbCriteria foreach conditions as key gt va
  • PHP 字节数组转 Base64(来自 Mssql 的字节数组)

    我在表上使用 Mssql 和图像 例如 0xFFD8FFE000104A46494 我觉得是这样的字节数组 我想用 PHP 将其更改为图像 我试试这个 img src 但图像不显示 代码演示 http sandbox onlinephpfu
  • 如何检查 id 是否已存在 - codeigniter

    我正在尝试检查数据库中的 id 是否已存在 如果不存在则仅插入该 id 而不是其他存在的 id 我尝试执行一个 where 语句来检查数据库中是否存在它们的 id 但即使它们是新信息 它也不会将其插入数据库中 我在这里很迷路 任何指导将不胜
  • 未知的 MySQL 服务器主机 (PHP)

    当尝试连接到我的数据库服务器时 我遇到了以下问题未知主机 Warning mysqli mysqli mysqli mysqli HY000 2005 Unknown MySQL server host xxxxxxxxxxxxx port
  • 联系表 7 根据用户选择立即发送给多个联系人

    您好 我正在 WordPress 联系表单 7 中创建联系表单 如果用户选择 全部 我想立即向多个收件人发送电子邮件 我看过这个 但似乎没有记录您是否可以一次发送给多个收件人http contactform7 com selectable
  • 正则表达式匹配 2 个或更多单词

    我有一个正则表达式尝试匹配 2 个或更多单词 但它没有按预期工作 我究竟做错了什么 string i dont know do you know preg match a z b 2 string match echo pre print
  • Laravel“未定义方法 Illuminate\Database\Query\Builder::attach()”

    我正在尝试在 Laravel 4 中的数据库播种期间关联相关模型 根据文档here http laravel com docs eloquent inserting related models 我可以这样做 user gt roles g
  • str_getcsv 未正确解析数据

    我对 PHP 的 str getcsv 函数有疑问 我有这个代码
  • orm和pdo的区别

    我对 ORM 和 PDO 之间的区别有点困惑 PDO是一种ORM吗 根据我的理解 ORM 基本上是一种数据映射 PDO 还提供了数据库数据的抽象 PDO 和 ORM 是两个完全不同的东西 PDO 是数据库访问抽象层的具体实现 它使您能够使用
  • 将 PHP 错误存储在日志文件中

    我想将 php 生成的任何错误和警告存储在日志文件中 但是still也以正常方式显示它们 回显 Thanks 您可以定义自己的函数并描述如何处理错误 http www php net manual en function set error
  • Laravel - 如何使用供应商类?

    我想在 m paths php 文件上使用移动检测 我已将该包添加为composer json 中的必需项 并将其安装在供应商文件中 我现在该如何使用它 我尝试了这个答案 但没有成功 因为找不到该课程 Laravel 4 使用供应商类 ht
  • 关联数组与 SplObjectStorage

    我正在编写代码来管理一组独特的对象 该代码的第一个原型使用关联数组 基本上就像我一直这样做的方式一样 然而 我也热衷于利用 PHP 的更现代版本中添加的功能 例如 SplObjectStorage 1 这样做 部分是作为一种学习经验 部分是
  • 使用类型映射选项的 PHP SoapClient 示例

    我在 PHP 的 SoapClient 中的命名空间使用方面遇到了一个小问题 从文档中我相信构造函数的类型映射选项将解决我的问题 http php net manual en soapclient soapclient php http p
  • 如何在服务器(无 GUI)上呈现网页以进行打印?

    我正在尝试使用 PHP 脚本将页面实用地打印到办公室打印机 这是我到目前为止所得到的 我在服务器上安装了一台打印机 我可以通过命令行的打印命令使用 PHP 向其发送作业 我还可以使用 PHP 脚本编写纯文本文件 然后将它们添加到打印提示中
  • 从php字符串中删除奇怪的字符

    这就是我现在所拥有的 将 RSS feed 绘制到 php 中 RSS feed 中的原始 xml 如下所示 Paul 8217 s Confidence 到目前为止我拥有的 php 是这样的 newtitle item gt title
  • 使用 jQuery 将值发送到 $_GET

    我正在使用一个 PHP 脚本 该脚本正在通过 GET 等待两个值 我正在尝试使用 jQuery 传递这两个值 而这正是我不太擅长的地方 这是我得到的代码 有人能指出我正确的方向吗 谢谢 function xrate id rating aj
  • 将 IP 地址与 IPv6 块进行比较

    我使用 PHP 将用户 IP 地址与 IP 块列表进行比较 其中大多数是 IPv4 但其中一些是 IPv6 我从用户那里获得的 IP 地址始终与 IPv4 兼容 至少我是这么假设的 我将如何比较这个 这就是我现在正在使用的 function
  • 使用 foreach 进行复杂的多维关联数组处理

    我不得不再次问这个问题 抱歉 但我在尝试处理这个数组时遇到了问题 我尝试了几种不同的方法 但没有一个是正确的 这是数组 Array search gt Array response gt Array errors gt number of
  • password_verify 哈希值与密码不匹配

    我使用下面的代码生成了密码哈希 hash password hash test PASSWORD BCRYPT 然后我使用 255 个字符将其存储在数据库中 然后我尝试使用比较器来测试登录 但失败了 它只允许我使用我之前刚刚生成的几行哈希登

随机推荐

  • 如何在 R 中重命名具有特定模式的文件?

    有一些 fcs文件在一个数据 000X目录中的格式 其中 X 1 2 3 我想重命名每个n文件格式如下 exp fcs where exp是来自向量的文本 如果要重命名的文件是 fcs file 换句话说 我想将文件重命名为exp txt
  • 将 PCAP 跟踪转换为 NetFlow 格式

    我想将一些 PCAP 跟踪转换为 Netflow 格式 以便使用 netflow 工具进行进一步分析 有什么办法可以做到这一点吗 具体来说 我想使用 flow export 工具从 netflow 跟踪中提取一些感兴趣的字段 如下所示 fl
  • php 中用于缩小/压缩 javascript 的简单正则表达式搜索和替换?

    你能在 php 中发布正则表达式搜索和替换来缩小 压缩 javascript 吗 例如 这是一个简单的 CSS header Content type text css ob start compress function compress
  • Java 正则表达式 - 重叠匹配

    在下面的代码中 public static void main String args List
  • Java正则表达式精确匹配8位数字

    我有一个简单的正则表达式 应该查找 8 位数字 String number scanner findInLine d 8 但事实证明 它也匹配9位或更多位的数字 如何修复此正则表达式以精确匹配 8 位数字 例如 12345678应该匹配 而
  • 安装镶木地板工具

    我正在尝试在 FreeBSD 机器上安装 parquet 工具 我克隆了这个仓库 git clone https github com apache parquet mr 然后我做了cd parquet mr parquet tools 然
  • 在 OCUnit 中使用核心数据类时出现 Apple Mach-O 链接器错误

    好的 这是我的测试类中的代码 NSManagedObjectContext managedObjectContextWithConcurrencyType NSManagedObjectContextConcurrencyType conc
  • 什么是 CSRF 代币?它的重要性是什么?它是如何运作的?

    我正在编写一个应用程序 Django 确实如此 我只想了解 CSRF 令牌 实际上是什么以及它如何保护数据 如果不使用CSRF token 发布的数据会不安全吗 简单来说 跨站请求伪造 CSRF 假设您当前已登录网上银行 www myban
  • 在 MySql 中将 VARCHAR 转换为 DECIMAL 值

    我已将包含字符串值 例如吃 和浮动值 例如 0 87 的 CSV 文件导入到我的 phpMyAdmin 数据库中的表中 在处理完所有字符串值并仅保留具有十进制值的行后 我需要将这些值从 VARCHAR 转换为 DECIMAL FLOAT 以
  • 定点的反平方根

    我正在寻找定点 16 16 数字的最佳反平方根算法 下面的代码是我到目前为止所拥有的 但基本上它取平方根并除以原始数字 我想得到不除法的倒数平方根 如果它发生任何改变 代码将为armv5te编译 uint32 t INVSQRT uint3
  • 为什么使用 static_cast(x) 而不是 (T)x?

    我听说static cast函数应该优先于 C 风格或简单函数风格的转换 这是真的 为什么 主要原因是经典的 C 类型转换不区分我们所说的static cast lt gt reinterpret cast lt gt const cast
  • 确定为特定函数调用分派哪个方法

    我试图理解一些我没有编写的代码 plot gam在 mgcv 中 并且有一个调用plot 函数带有一些我不认识的奇怪参数 例如 P 我想弄清楚这次调用正在调度哪个绘图方法 findMethod 和类似的功能没有帮助 我认为情节是S3 我尝试
  • php shell_exec 权限被拒绝

    shell exec touch Users Nerses Downloads ads txt 2 gt 1 我的 PHP exec shel exec 函数有问题 它说我没有执行该命令的权限 怎样才能打开这些权限呢 您的 PHP 代码正在
  • sql 2008 中没有索引的表列表

    如何列出 SQL 2008 数据库中没有索引的表 Edit我想要架构名称和表名称 这应该涵盖您正在寻找的内容 即堆表 无聚集索引 并且没有任何非聚集索引 它使用新的系统 2005 2008 年使用的表对象 此外 您可能想要查找具有聚集索引但
  • 添加属性时,如何保留 .NET 程序集的 COM 二进制兼容性?

    我们开发了一个 NET 程序集来存储语言翻译信息 并且需要由 VB6 应用程序使用 我们希望能够更改翻译信息而无需重新编译应用程序 翻译由名为 LanguageServices 的两个文件部分类提供 一个文件是不变的库方法 另一个文件是从
  • 如何在Cypress.io(电子/铬)中设置浏览器语言? [复制]

    这个问题在这里已经有答案了 我的问题是关于配置Cypress以某种语言启动浏览器实例 为了 对本地化 i18n 文本标签进行断言 检查 i18n 功能 在语言之间切换 绕过持续集成 CI CD 的问题 例如 本地计算机 浏览器默认为fr F
  • 如何将 Xcode 降级到以前的版本?

    我偶尔需要使用 Xcode 现在遇到一个问题 我已经升级到 Xcode 4 6 但我使用的另一个软件不支持它 所以我需要返回到 Xcode 4 5 我不习惯 Mac 的一般工作方式 因此如果所提供的答案可以在编写时考虑到这一点 那将会很有帮
  • Resharper Intellisense 可以配置为按字母顺序排序吗?

    我最近更新为使用 VS2013 和 Resharper 8 2 从 VS2010 和 Resharper 6 并发现了一个非常烦人的 feature 因为 Resharper 的智能感知不会按字母顺序对类成员进行排序 举例来说 我有一个名为
  • .NET 中的自定义文化感知日期格式

    在 NET 中 用于格式化 DateTime 值的大多数标准字符串都是区域性感知的 例如 ShortDatePattern d 格式字符串根据当前区域性切换年 月 日部分的顺序 6 15 2009 1 45 30 PM gt 6 15 20
  • PHP 作为 FastCGI 应用程序运行 (php-cgi) - 如何发出并发请求?

    编辑 更新 向下滚动 编辑2 更新 问题已解决 Some background information 我正在用 Java 编写自己的网络服务器 几天前我询问 Apache 与 PHP 的接口到底如何 这样我就可以实现 PHP 支持 我了解