백엔드 개발 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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다 PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다 Apr 14, 2025 am 12:13 AM

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오 PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오 Apr 13, 2025 am 12:20 AM

PHP는 현대 웹 개발, 특히 컨텐츠 관리 및 전자 상거래 플랫폼에서 중요합니다. 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-BIN"과 같은 CGI 디렉토리를 작성하고 Apache 쓰기 권한을 부여하십시오. Apache 구성 파일에 "Scriptalias"지시록 블록을 추가하여 CGI 디렉토리를 "/cgi-bin"URL에 매핑하십시오. Apache를 다시 시작하십시오.

PHP : 웹 개발의 핵심 언어 PHP : 웹 개발의 핵심 언어 Apr 13, 2025 am 12:08 AM

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 ​​있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

아파치를 시작하는 방법 아파치를 시작하는 방법 Apr 13, 2025 pm 01:06 PM

Apache를 시작하는 단계는 다음과 같습니다. Apache 설치 (명령 : Sudo apt-get Apache2를 설치하거나 공식 웹 사이트에서 다운로드) 시작 apache (linux : sudo systemctl start : windes (선택 사항, Linux : Sudo SystemCtl

PHP의 지속적인 관련성 : 여전히 살아 있습니까? PHP의 지속적인 관련성 : 여전히 살아 있습니까? Apr 14, 2025 am 12:12 AM

PHP는 여전히 역동적이며 현대 프로그래밍 분야에서 여전히 중요한 위치를 차지하고 있습니다. 1) PHP의 단순성과 강력한 커뮤니티 지원으로 인해 웹 개발에 널리 사용됩니다. 2) 유연성과 안정성은 웹 양식, 데이터베이스 작업 및 파일 처리를 처리하는 데 탁월합니다. 3) PHP는 지속적으로 발전하고 최적화하며 초보자 및 숙련 된 개발자에게 적합합니다.

PHP 대 기타 언어 : 비교 PHP 대 기타 언어 : 비교 Apr 13, 2025 am 12:19 AM

PHP는 특히 빠른 개발 및 동적 컨텐츠를 처리하는 데 웹 개발에 적합하지만 데이터 과학 및 엔터프라이즈 수준의 애플리케이션에는 적합하지 않습니다. Python과 비교할 때 PHP는 웹 개발에 더 많은 장점이 있지만 데이터 과학 분야에서는 Python만큼 좋지 않습니다. Java와 비교할 때 PHP는 엔터프라이즈 레벨 애플리케이션에서 더 나빠지지만 웹 개발에서는 더 유연합니다. JavaScript와 비교할 때 PHP는 백엔드 개발에서 더 간결하지만 프론트 엔드 개발에서는 JavaScript만큼 좋지 않습니다.

PHP vs. Python : 핵심 기능 및 기능 PHP vs. Python : 핵심 기능 및 기능 Apr 13, 2025 am 12:16 AM

PHP와 Python은 각각 고유 한 장점이 있으며 다양한 시나리오에 적합합니다. 1.PHP는 웹 개발에 적합하며 내장 웹 서버 및 풍부한 기능 라이브러리를 제공합니다. 2. Python은 간결한 구문과 강력한 표준 라이브러리가있는 데이터 과학 및 기계 학습에 적합합니다. 선택할 때 프로젝트 요구 사항에 따라 결정해야합니다.

See all articles