首页 后端开发 php教程 200分求优化建议,该如何解决

200分求优化建议,该如何解决

Jun 13, 2016 pm 01:50 PM
apache gt http php soap

200分求优化建议
问题是这样的:

a -> b -> c

a是我们的合作方,他们负责通过http协议给我们同步数据。
b是我们,负责接收a推过来的数据,做业务逻辑处理后,再把整理好的数据推给我们的合作方c(有很多c)。


我的程序整体架构是这样的:
1 有一个入口文件,其实就是个php文件,负责接收a的数据,存入数据库。
2 我用nohup命令调用php cli模式开了一个php进程运行一个php文件在系统后台处理下面的事情:从数据库中一次取出10条数据,循环fetch出每一条,然后根据业务逻辑,根据每条数据的不同,转发给不同的c(其实就是要访问不同的url)。


a给我同步数据的时候,一秒可能会来10几条,他们是多线程发包。而我这边经过入库,一次取出10条数据,循环推送到不同的url地址,在收到他们接口给我响应的'ok'后,做标记,然后推送下一条数据,如果在我设置的超时时间5秒后还没有收到对方的'ok',则重发,超时时间依然是5秒,共重发2次。等于一条数据最多推送3次,3次都推不过去的话就不管了。并且,我在每次推送数据间设置sleep了1秒。


遇到的问题:
正常情况下,推一条数据应该大概在2秒以内,但如果某个c,他的接口受网络原因或程序的问题,我3次推送都没推过去(也就是说他的接口响应速度大于5秒或根本没响应),它会令我的数据队列最多懈怠18秒的时间。这会令推送速度大大降低!我今天看了下,我的数据队列比正常速度大概慢了一个小时。请问有什么好的方法解决这个问题吗?
php本身不支持多线程,我无法设置不同的线程去给不同的c推送数据。所以一个c的接口响应慢,会影响所有的c,影响整个数据队列。
不知有没有朋友做过这方面的东西,指教点经验。除了要求c提高接口响应速度,和保证网络畅通外。有没有我自己这边解决问题的方法?我的一些合作方它们用的都是java,可以建立线程池多线程发包,但php这点比较无奈。


其实在以前,我采用的方式是同步转发,也就是接到a的数据后,立刻处理业务逻辑,然后立刻把数据同步转发给c,不入队列。这样是没有上述问题的,但这样会产生很多其它问题,所以我现在才改成这种队列的方式。

我想了两个解决方案不知是否可行:
1 php本身不支持多线程,但linux下的curl,wget,或apache带的ab。它们支持多线程的,我是否可以用php去调用它们来实现多线程推数据?给每个不同的c分配一个线程,这样,一个c堵塞,不会影响其它的c。
2 不支持多线程,我用多进程,我给每个不同的c开一个单独的php进程,这样也可以避免c之间互相影响。但我不清楚开这么多进程无限死循环着运行会对操作系统有多大影响。目前我们这个业务大概有10个c。


希望大家给点意见,指点下,谢谢!

------解决方案--------------------
开多进程,给每个c开一个单独的php进程,
影响,就同时开2个,一直用,一个监视一些其它进程,一个做文件操作,都死循环样运行,
没发现死循环 本身对负载有影响。当调度文件操作的时候,肯定会影响负载。cpu/硬盘读写够强,应该没问题吧,或者减少到5个,每个对应2个c

------解决方案--------------------
频繁查库不知到是否有瓶颈,如果是a来的直接数据,没有作处理,不如除了存库,另外放到内存,产生队列,让php进程去内存队列拿
------解决方案--------------------
用SOAP解决
------解决方案--------------------
用SOAP解决可行性高
原理是,soap监听接收数据
然后soap后台启动多进程

------解决方案--------------------
对了,不如不等待返回
x.php一直运行,定时从内存队列获得数据,并给内存中数据作个标记,然后处理后推送c端,但不等待返回
x.php获取数据时,在一段时间内只获得无标记的数据
c端返回要求,发到另外一个,m.php,接收返回,并和内存队列对比,删除符合的
------解决方案--------------------
PHP CLI模式在非WIN下可以多线程 但很弱 

HTTP是无状态协议 完全可以多进程来做 但其中有个严重的问题

A-> 10+/S 
->C 10/5S
也就是说 C的发送速度要低于A的接收速度 造成前一个C还未退出就再启动一个C 最后堆积了N个进程系统崩溃 或者每个C一个进程 造成很大的数据延迟

可以给每个C单独一个进程 但每次不限于10条 应该是积压了几条就发几条 这样能有效的控制进程数量和延迟 最大延迟基本上就是运行时间+传输时间
再或者每个C单独进程+多线程 弄个列队每个线程10条 积压超过10条就启动新的线程 基本上每个进程启动20个线程就足够保证同步了

数据提供俺的做法是被动访问 毕竟用户不多 几K节点的XML生成发送 负载都不算高 而且可以利用缓存

呵呵 SOAP可能更合适 可需要上游和下游一起支持
------解决方案--------------------
我的建议:

1、把你当前的处理B->C的php cli程序放到apache下,即http://www.x.com/b2c.php

2、开一个独立的php CLI进程php.exe db_read.php,去循环读数据库并将读取的字段提交给b2c.php
你可以一次提交10个都没问题,因为apache支持多线程:)


------解决方案--------------------
我不大了解这个,不过前段时间看到一个“服务器推”技术。或许有用。

另外,我说说sql查询这块儿,假设你的sql数据库没有太多优化的话,每次查询10条,这样速度会有瓶颈,当然,或许数据的要求对于这个查询完全能够满足。

以你的推送速度来推理,建议一次性读取数据比如100条,暂存为一个文件,文件操作毕竟比数据库操作要快。

推送出去10条删除10条,当只剩下10条的时候,再读取100条。这样能减少数据库的读取次数。

想要优化,就要优化到牙齿。其它的方面恕我没有想到什么方式,材疏学浅,帮不上忙了。
------解决方案--------------------
开多进程,给每个c开一个单独的php进程, 
影响,就同时开2个,一直用,一个监视一些其它进程,一个做文件操作,都死循环样运行,
------解决方案--------------------

引用楼主 ShadowSniper 的帖子:
问题是这样的:

a -> b -> c

a是我们的合作方,他们负责通过http协议给我们同步数据。
b是我们,负责接收a推过来的数据,做业务逻辑处理后,再把整理好的数据推给我们的合作方c(有很多c)。


我的程序整体架构是这样的:
1 有一个入口文件,其实就是个php文件,负责接收a的数据,存入数据库。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP的当前状态:查看网络开发趋势 PHP的当前状态:查看网络开发趋势 Apr 13, 2025 am 12:20 AM

PHP在现代Web开发中仍然重要,尤其在内容管理和电子商务平台。1)PHP拥有丰富的生态系统和强大框架支持,如Laravel和Symfony。2)性能优化可通过OPcache和Nginx实现。3)PHP8.0引入JIT编译器,提升性能。4)云原生应用通过Docker和Kubernetes部署,提高灵活性和可扩展性。

apache中cgi目录怎么设置 apache中cgi目录怎么设置 Apr 13, 2025 pm 01:18 PM

要在 Apache 中设置 CGI 目录,需要执行以下步骤:创建 CGI 目录,如 "cgi-bin",并授予 Apache 写入权限。在 Apache 配置文件中添加 "ScriptAlias" 指令块,将 CGI 目录映射到 "/cgi-bin" URL。重启 Apache。

PHP:网络开发的关键语言 PHP:网络开发的关键语言 Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

apache怎么启动 apache怎么启动 Apr 13, 2025 pm 01:06 PM

启动 Apache 的步骤如下:安装 Apache(命令:sudo apt-get install apache2 或从官网下载)启动 Apache(Linux:sudo systemctl start apache2;Windows:右键“Apache2.4”服务并选择“启动”)检查是否已启动(Linux:sudo systemctl status apache2;Windows:查看服务管理器中“Apache2.4”服务的状态)启用开机自动启动(可选,Linux:sudo systemctl

PHP的持久相关性:它还活着吗? PHP的持久相关性:它还活着吗? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP与其他语言:比较 PHP与其他语言:比较 Apr 13, 2025 am 12:19 AM

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP与Python:核心功能 PHP与Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有优势,适合不同场景。1.PHP适用于web开发,提供内置web服务器和丰富函数库。2.Python适合数据科学和机器学习,语法简洁且有强大标准库。选择时应根据项目需求决定。

See all articles