”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 用冰柱在几分钟内构建超快的PHP服务器

用冰柱在几分钟内构建超快的PHP服务器

发布于2025-03-24
浏览:364

事件驱动的编程为习惯于程序编码的PHP开发人员提出了一个独特的挑战。 在PHP的程序性质中,事件通常归结为简单的函数调用,而没有固有的异步行为。 所有代码执行仍然阻塞。

但是,像JavaScript这样的语言将事件循环作为中心组件的潜力。 该见解使开发人员将事件循环和异步功能集成到PHP HTTP服务器中。本文展示了构建利用Icicle库的高性能PHP HTTP服务器,并将其与Apache集成以进行优化的静态文件服务。 示例代码可在

https://github.com/sitepoint-editors/icicle-http-server 。 [2 [2

icicle的异步力:

静态文件的apache Integration:Build a Superfast PHP Server in Minutes with Icicle 有效地将静态文件卸载到apache上,使PHP Icicle服务器可处理动态请求。

路由和模板增强功能:

使用路由器扩展基本服务器(如League \ Route)允许进行复杂的请求处理和路由。 模板引擎(例如League \ Plates)添加了为复杂应用程序的布局和模板继承等功能。 apache Configuration用于优化的静态文件服务

要避免使用静态文件的不必要的PHP处理,请配置Apache直接服务它们:
  • rewriteEngine on 重新WritriteCond%{request_filename}!-f rewriteCond%{request_filename}!-d 重写 ^(。*)http://%{server_name}:9001%{request_uri} [p]
  • mod_rewrite
  • 首先安装冰柱: 一个简单的ICICE HTTP服务器示例:
  • // server.php 需要__________。 “/vendor/autoload.php”; 使用Icicle \ http \ Message \ requestInterface; 使用Icicle \ HTTP \ Message \ Response; 使用Icicle \ HTTP \ Server \ Server; 使用冰柱\ loop; 使用Icicle \ socket \ client \ clientinterface; $ server = new Server(函数(requestInterface $ request,clientinterface $ client){ $ wenspy =(新响应(200)) - > withheader(“ content-type”,“ text/plain”); 产生$ revyse--> getBody() - > end(“ Hello world”); 产生$响应; }); $ server->听(9001); loop \ run();
  • 带有League \ Route
的高级路由

为了更强大的路由,请集成League \ Route: [2 [2 // server.php // ...(以前的导入)... 使用League \ Route \ http \ exception \ MethodNotloweredException; 使用League \ Route \ http \ exception \ notfoundException; 使用League \ Route \ RuteCollection; 使用League \ Route \ strument \ Uristrategy; // ...(服务器创建)... $ router = new RuteCollection(); $ router-> setstrategy(new Uristrategy()); 需要__________。 “/routes.php”; $ dispatcher = $ router-> getDisPatcher(); 尝试 { $ result = $ dispatcher-> dispatch($ request-> getMethod(),$ request-> getRequestTarget()); $状态= 200; $ content = $ result-> getContent(); } catch(notFoundException $ e){ $状态= 404; $ content =“找不到”; } catch(methodnotallowedexception $ e){ $状态= 405; $ content =“不允许的方法”; } // ...(响应创建和发送)...

[2 [2 返回“ Hello World”; });

[2
有关复杂的视图,请使用League \ plates:
原始文章包括性能基准测试,以演示服务器处理大量并发请求的功能。  这些基准应在其运行的特定硬件和条件的背景下进行考虑。  关键要点是通过Icicle的异步模型具有高性能的潜力。  本文通过鼓励实验和社区讨论结束。  还包括由Icicle作者提供的更新的基准测试。  FAQ部分进一步阐明了使用Icicle进行服务器开发的各个方面。
最新教程 更多>
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-07-14
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c [&& && && && && && && && && && &&&&&&&&&&&&&&&&&&&&&&&华仪的函数时,在接受成员函数指针的函数时,要在函数上既要提供指针又可以提供指针和指针到函数的函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此...
    编程 发布于2025-07-14
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-07-14
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-07-14
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-07-14
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-07-14
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    在Microsoft Visual C 中,Microsoft consions用户strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    编程 发布于2025-07-14
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-07-14
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-07-14
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-07-14
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-07-14
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示Achieving Text-Only Extraction with Python's MLStripperTo streamline the stripping process, the Python standard librar...
    编程 发布于2025-07-14
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-07-14
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在银光应用程序中,尝试使用LINQ建立错误的数据库连接的尝试,无法找到以查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中,tblpersoon可能需...
    编程 发布于2025-07-14
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-07-14

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3