草庐IT

php - 网络套接字和 PHP

coder 2024-04-19 原文

我开始考虑将 websockets 作为替代我正在调试的新构建 PHP 应用程序中的长轮询的解决方案。

我有几个问题想知道是否有人可以帮我解决。

  1. Nodejs 服务器可以调用 PHP 吗?如果可以,它是否会在连接方面遇到与仅通过 Apache 一样的缺点?我们都知道 nodejs 是非阻塞的,而 Apache 等不是,但是如果 Nodejs 只是在它自己的过程中调用 PHP 服务器,那不会以类似的方式出现瓶颈吗?
  2. PHP 和 websockets 匹配吗?
  3. 除了显然只适用于 Nodejs 的 socketio 之外,还有其他好的 js 库吗?
  4. 有没有人找到一个很好的教程,它使用 websockets 和 PHP 后端,可能使用类似 Ratchet PHP 库的东西,这可能会帮助我继续前进?

想法将不胜感激。

最佳答案

请原谅我对您问题的解释。

1:Node.js可以调用PHP吗,那不是和Apache一样有缺点吗?

调用一次运行的 PHP 脚本将具有与调用网页相同的一般缺点,只是您要删除额外的处理层。 Apache 或任何 Web 服务器本身是一个非常薄的层,虽然您会节省一些时间,但节省的时间微不足道。

如果 PHP 在为您的客户收集数据方面比 Node.js 更有效,无论出于何种原因,那么在您的应用程序中包含 PHP 可能是明智的。

2:PHP 和 WebSockets 匹配吗?

传统的 PHP 脚本通常针对每个请求运行一次。绝大多数 PHP 开发人员不熟悉事件驱动开发,并且 PHP 本身(还)不支持异步处理。

PHP 是一种快速、成熟的脚本语言,它只会变得越来越快,即使它有许多缺陷和缺点。 (有人说它的弱类型是缺点,也有人说它的类型不够弱是缺点。)

也就是说,任何语言要实现 WebSockets 所需的最低限度是能够打开一个基本的 TCP 端口并监听请求。对于 PHP,它是作为 C 套接字库的薄包装器实现的,并且还有其他可用的扩展和框架也可以改变使用 PHP 在 TCP 套接字中工作的感觉。

PHP的垃圾收集器也已经成熟。内存泄漏要么来自对内存空间的粗暴忽视(我在看着你,Zend Framework),要么来自自认为聪明或想证明打败垃圾收集系统有多么容易的开发人员故意破坏垃圾收集系统GC。 (剧透:如果您知道详细信息,那么在每种语言中都很容易!)

在 PHP 中设置守护进程(长时间运行的后台进程)是完全可能且非常容易的。甚至有可能让它表现得足够好以优雅地重新启动并将其连接移交给同一脚本的新版本,甚至是运行不同版本 PHP 的同一服务器上的同一脚本,尽管这超出了范围一点点。

至于匹配与否,完全由开发者决定。您愿意、能够并乐于使用 PHP 编写 WebSockets 服务器,还是使用现有服务器之一?是的?那么就是 PHP 和 WebSockets 的完美搭档。

3: WebSockets 的 JS 库

老实说,我还没有研究过它们。

4: 使用 PHP 和 Websockets 的教程

我个人很喜欢这个教程:http://www.phpbuilder.com/articles/application-architecture/optimization/creating-real-time-applications-with-php-and-websockets.html

虽然我有充分的理由知道该教程的细节对于特定的 WebSockets 服务器来说很快就会过时。 (不过,该服务器仍将有一个积极维护的遗留分支。)

如果链接失效:

使用 PHP-Websockets 服务器(在 Github 上可用,即将上线),扩展基础 WebSocketServer 抽象类并实现抽象方法 process()connected()closed()

不过,上面的链接中有更好的信息,所以只要链接存在,就关注它。

关于php - 网络套接字和 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15220501/

有关php - 网络套接字和 PHP的更多相关文章

  1. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  2. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  3. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

    s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

  4. ruby-on-rails - Ruby 的 'open_uri' 是否在读取或失败后可靠地关闭套接字? - 2

    一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我

  5. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  6. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

  7. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

    我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

  8. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  9. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

  10. 常见网络安全产品汇总(私信发送思维导图) - 2

    安全产品安全网关类防火墙Firewall防火墙防火墙主要用于边界安全防护的权限控制和安全域的划分。防火墙•信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。防火墙是一个由软件和硬件设备组合而成,在内外网之间、专网与公网之间的界面上构成的保护屏障。下一代防火墙•下一代防火墙,NextGenerationFirewall,简称NGFirewall,是一款可以全面应对应用层威胁的高性能防火墙,提供网络层应用层一体化安全防护。生产厂家•联想网御、CheckPoint、深信服、网康、天融信、华为、H3C等防火墙部署部署于内、外网编辑额,用于权限访问控制和安全域划分。UTM统一威胁管理(Un

随机推荐