首页 > 后端开发 > 正文

php为什么不适合socket

2024-09-09 15:21:54 | 我爱编程网

今天我爱编程网小编整理了php为什么不适合socket相关内容,希望能帮助到大家,一起来看下吧。

本文目录一览:

php为什么不适合socket

php为什么不适合socket


作为一名非底层程序员,要想深入了解socket的内部实现机制是很困难的,我们只需明白socket是一套操作系统封装好的实现进程通信的函数,会创建和调用就够了。

PHP的语言特性和自身定位决定了它只适合做socket客户端,而不适合做socket服务器端。
因为socket主要面向底层和网络服务开发,一般服务器端都是用 C 或 Java 等语言实现,这样能更好地操作底层,对网络服务开发中遇到的问题(如并发、阻塞等)也有成熟完善的解决方案,而PHP显然不适合这种应用场景。 (推荐学习:PHP视频教程)
实际上,PHP操作MySQL数据库也是通过socket进行的,这正是由于socket屏蔽了底层的协议,使得网络服务之间的互联互通变得简单。

除了传统的服务器端语言实现的socket外,随着HTML5的流行,浏览器客户端实现的WebSocket也逐渐兴起,对于这一点值得关注,FlashSocket也是一个不错的解决方案。

要在客户端操作socket,可使用fsockopen、socket_create 或 stream_socket_client 等函数实现,如果是PHP5,推荐使用stream_socket_client。

socket交互应用实例:使用socket提交表单

新建一个 test.php 文件,向 提交表单数据,代码如下:
<?php
$data = array('comment'=>'this is a robot comment');
$data = http_build_query($data);

$out = "POST HTTP/1.1\r\n"; // 通过POST方式发送数据
$out .= "Host: demo.com\r\n";
$out .= "Content-type: application/x-www-form-urlencoded; charset=UTF-8\r\n";
$out .= "Content-length: ".strlen($data)."\r\n";
$out .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:48.0) Gecko/20100101 Firefox/48.0"."\r\n";
$out .= "Connection: close"."\r\n"."\r\n"; // 注意:此处有两个 \r\n

$out .= $data."\r\n"; // 正文数据

$fp = fsockopen("demo.com", 80, $errno, $errstr, 30); // 创建socket客户端连接

// $fp = stream_socket_client("tcp://demo.com:80", $errno, $errstr, 30); 推荐这种写法

fwrite($fp, $out); // 向服务器发送数据

while (!feof($fp)) {
echo fgets($fp, 1280); // 读取服务器响应的数据
}
fclose($fp); // 关闭socket连接
?>需要注意以下几点:
fsockopen的第一个参数,也可以使用IP地址,不要带 字符串,除非使用SSL等
请求头(headers)不一定要带上所有的头域,一般只需带上几个核心的header即可
在最后一个header处,即 Connection 后有两个换行
注意编码问题

php为什么不适合socket

关于PHP的sleep()函数导致的问题

但是同时两次访问index1.php,第二个需要等第一个完成之后再等20秒才能正常显示,即第二个页面需要等40s才能正常显示

--------------------------------------
你是怎么同时2次访问index1.php的?

即第二个页面需要等40s才能正常显示
------------------------------------------
第二个页面也是index1?

php为什么不适合socket我爱编程网

PHP-FPM 解析(转-侵删)

我爱编程网(https://www.52biancheng.com)小编还为大家带来PHP-FPM 解析(转-侵删)的相关内容。

FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器,它主要负责管理进程。FPM的核心功能在于进程管理,而理解其管理的进程需要从FastCGI说起。

FastCGI是Web服务器(如Nginx、Apache)和处理程序之间的一种通信协议,它类似于HTTP协议,但只是一种应用层通信协议。实际上,PHP只是一个脚本解析器,它可以通过命令行(cli模式)或网络场景下(HTTP请求)运行。在HTTP场景下,PHP利用FastCGI与Web服务器协同处理请求。Web服务器接收请求,通过FastCGI协议将解析结果转发给PHP处理程序,处理程序完成任务后将结果返回给Web服务器,再由Web服务器发送给用户。

PHP实现了FastCGI协议,但并未实现完整的网络处理功能。其处理模型通常为多进程或多线程:主进程负责管理子进程,而子进程负责具体的网络事件处理。Nginx和fpm采用多进程模型,而memcached可能采用多线程模型。

FPM的基本实现包括创建master进程、监听套接字、fork出多个子进程。子进程接受请求并阻塞在accept操作上,直至请求完成。在请求处理期间,子进程不会接收其他请求,这是与nginx事件驱动模型的主要区别。

master进程与worker进程间通过共享内存进行信息交换,获取worker进程的状态和处理请求的数量。当master需要终止worker进程时,通过发送信号通知。

FPM支持监听多个端口,每个端口对应一个worker pool,pool下包含多个worker进程,类似于nginx中的server概念。

启动流程从main()函数开始,包括配置解析、初始化共享内存、注册信号处理、创建套接字和事件管理。随后,fork出worker进程,master进程阻塞在事件循环中,而worker进程处理请求。

worker进程处理请求分为5个阶段,master通过fpm_scoreboard_proc_s->request_stage标识判断worker进程状态。

FPM的进程管理依赖于注册的事件。sp[1]管道可读事件用于处理信号,master通过向sp[1]写入数据触发sp[0]可读事件。fpm_pctl_perform_idle_server_maintenance_heartbeat事件用于管理dynamic和ondemand模式下的worker进程。fpm_pctl_heartbeat事件限制worker处理单个请求的最大时间,超过配置的timeout值,master将发送kill -TERM信号终止worker进程。

FPM的核心实现相对简单,主要关注进程管理和请求处理。

以上就是php为什么不适合socket全部内容,更多相关信息,敬请关注我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“php为什么不适合socket”相关推荐