백엔드 개발 PHP 튜토리얼 单台服务器的PHP进程之间实现共享内存的方法_php技巧

单台服务器的PHP进程之间实现共享内存的方法_php技巧

May 17, 2016 am 08:42 AM
공유 메모리

开发人员要想使php进程实现共享内存的读写,首先就要支持IPC函数,即php编译安装时指定:--enable-shmop  与--enable-sysvsem 两个选项

IPC (Inter-process communication) 是一个Unix标准机制,它提供了使得在同一台主机不同进程之间可以互相的方法。基本的IPC处理机制有3种:它们分别是共享内存、信号量和消息队列。本文中我们主要讨论共享内存和信号量的使用。

在不同的处理进程之间使用共享内存是一个实现不同进程之间相互的好方法。如果你在一个进程中向所共享的内存写入一段信息,那么所有其他的进程也可以看到这段被写入的数据。非常方便。在PHP中有了共享内存的帮助,你可以实现不同进程在运行同一段PHP脚本时返回不同的结果。或实现对PHP同时运行数量的实时查询等等。

共享内存允许两个或者多个进程共享一给定的存储区。因为数据不需要在客户机和服务器之间复制,所以这是最快的一种IPC。使用共享内存的唯一窍门是多个进程对一给定存储区的同步存取。

如何建立一个共享内存段呢?下面的代码可以帮你建立共享内存。

复制代码 代码如下:
$shm_id = shmop_open($key, $mode, $perm, $size);

注意,每个共享内存段都有一个唯一的ID, 在PHP中,shmop_open会把建立好的共享内存段的ID返回,这里我们用$shm_id记录它。而$key是一个我们逻辑上表示共享内存段的Key值。不同进程只要选择同一个Key id就可以共享同一段存储段。习惯上我们用一个串(类似文件名一样的东西)的散列值作为key id. $mode指明了共享内存段的使用方式。这里由于是新建,因此值为'c' –取create之意。如果你是已经建立过的共享内存那么请用'a', 取access之意。$perm参数定义了的权限,8进制,关于权限定义请看UNIX文件系统帮助。$size定义了共享内存的大小。尽管有点象fopen(文件处理)你可不要当它同文件处理一样。后面的描述你将看到这一点。

例如:

复制代码 代码如下:
$shm_id = shmop_open(0xff3, "c", 0644, 100);

这里我们打开了一个共享内存段 键值0xff3 –rw-r—r—格式,大小为100字节。

如果需要已有的共享内存段,你必须在调用shmop_open中设第3、4个参数为0。

在Unix下,你可以用一个命令行程序ipcs查询系统所有的IPC资源状态。不过有些系统要求需要超级用户方能执行。下图是一段ipcs的运行结果。

上图中系统显示了4个共享内存段,注意其中第4个键值为0x00000ff3的就是我们刚刚运行过的PHP程序所创建的。关于ipcs的用法请参考UNIX用户手册。

如何释放共享内存呢

释放共享内存的办法是调用PHP指令:shmop_delete($id)

复制代码 代码如下:
shmop_delete($id);

$id 就是你调用shmop_open所存的shmop_op的返回值。还有一个办法就是用UNIX的管理指令:

ipcrm id, id就是你用ipcs看到的ID.和你程序中的$id不一样。不过要小心,如果你用ipcrm直接删除共享内存段那么有可能导致其他不知道这一情况的进程在引用这个已经不复存在的共享内存器时出现一些不可预测的错误(往往结果不妙)。

如何使用(读写)共享内存呢

使用如下所示函数向共享内存写入数据

复制代码 代码如下:
int shmop_write (int shmid, string data, int offset)

其中shmid是用shmop_open返回的句柄。$Data变量存放了要存放的数据。$offset描述了写入从共享内存的开始第一个字节的位置(以0开始)。

读取操作是:

复制代码 代码如下:
string shmop_read (int shmid, int start, int count)

同样,指明$shmid,开始偏移量(以0开始)、总读取数量。返回结果串。这样,你就可以把共享内存段当作是一个字节数组。读几个再写几个,想干嘛就干嘛,十分方便。

现在,在单独的一个PHP进程中读写、创建、删除共享内存方面上你应该没有问题了。但是,显然实际运行中不可能只是一个PHP进程在运行中。如果在多个进程的情况下你还是沿用单个进程的处理方法,你一定会碰到问题--著名的并行和互斥问题。比如说有2个进程同时需要对同一段内存进行读写。当两个进程同时执行写入操作时,你将得到一个错误的数据,因为该段内存将之可能是最后执行的进程的内容,甚至是由2个进程写入的数据轮流随机出现的一段混合的四不象。这显然是不能接受的。为了解决这个问题,我们必须引入互斥机制。互斥机制在很多操作系统的教材上都有专门讲述,这里不多重复。实现互斥机制的最简单办法就是使用信号灯。信号量是另外一种进程间(IPC)的方式,它同其他IPC机构(管道、FIFO、消息队列)不同。它是一个记数器,用于控制多进程对共享数据的存储。同样的是你可以用ipcs和ipcrm实现对信号灯使用状态的查询和对其实现删除操作。在PHP中你可以用下列函数创建一个新的信号量并返回操作该信号量的句柄。如果该key指向的信号量已经存在,sem_get直接返回操作该信号量的句柄。

复制代码 代码如下:
int sem_get(int key [, int max_acquire [, int perm]])

$max_acquire 指明同时最多可以用几个进程进入该信号而不必等待该信号被释放(也就是最大同时处理某一资源的进程数目,一般该值均为一)。$perm指明了权限。

一旦你成功的拥有了一个信号量,你对它所能做的只有2种:请求、释放。当你执行释放操作时, 系统将把该信号值减一。如果小于0那就还设为0。而当你执行请求操作时,系统将把该信号值加一,如果该值大于设定的最大值那么系统将挂起你的处理进程直到其他进程释放到小于最大值为止。一般情况下最大值设为1,这样一来当一个进程获得请求时其他后面的进程只能等待它退出互斥区后释放信号量才能进入该互斥区并同时设为独占方式。这样的信号量常称为双态信号量。当然,如果初值是任意一个正数就表明有多少个共享资源单位可供共享应用。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

win10gpu 공유 메모리를 끄는 방법 win10gpu 공유 메모리를 끄는 방법 Jan 12, 2024 am 09:45 AM

컴퓨터에 대해 좀 아는 친구들은 GPU가 메모리를 공유한다는 사실을 알아야 하며, 공유 메모리로 인해 메모리 수가 줄어들고 컴퓨터에 영향을 미칠까 봐 걱정하는 친구들이 많아서 끄는 방법을 알려드리겠습니다. 보다. win10gpu 공유 메모리 끄기: 참고: GPU의 공유 메모리는 끌 수 없지만 해당 값은 최소값으로 설정할 수 있습니다. 1. 부팅할 때 DEL을 눌러 BIOS로 들어갑니다. 일부 마더보드에서는 BIOS 인터페이스 상단에 "기본, 고급" 및 기타 설정을 포함한 많은 탭이 있습니다. " 옵션. 아래 인터페이스에서 SouthBridge 설정 옵션을 찾아 Enter를 클릭하여 들어갑니다.

Golang 함수에서 다중 프로세스 간 공유 메모리 적용 방법 Golang 함수에서 다중 프로세스 간 공유 메모리 적용 방법 May 17, 2023 pm 12:52 PM

동시성 프로그래밍 언어인 Golang의 내장 코루틴 메커니즘과 멀티스레드 작업은 가벼운 멀티태스킹을 가능하게 합니다. 그러나 다중 프로세스 처리 시나리오에서는 서로 다른 프로세스 간의 통신 및 공유 메모리가 프로그램 개발의 주요 문제가 되었습니다. 이번 글에서는 Golang에서 여러 프로세스 간 공유 메모리를 구현하는 응용 방법을 소개합니다. 1. Golang에서 다중 프로세스 구현 방법 Golang에서는 다중 프로세스 동시 처리를 포크(fork), os.Process,

PHP 공유 메모리 기능 사용법 및 응용 PHP 공유 메모리 기능 사용법 및 응용 Jun 16, 2023 pm 12:27 PM

PHP 공유 메모리 기능 사용법 및 활용 공유 메모리란 여러 프로세스가 동시에 동일한 메모리 공간에 접근하는 기술을 말합니다. 동시 프로그래밍에서는 공유 메모리를 프로세스 간 통신에 사용하여 서로 다른 프로세스 간에 데이터를 공유할 수 있습니다. PHP는 관련 공유 메모리 기능도 제공합니다. 이 기사에서는 PHP 공유 메모리 기능의 사용법을 소개하고 몇 가지 실제 애플리케이션 시나리오에 대해 설명합니다. 공유 메모리 기능 사용 PHP는 PHP가 시스템 공유 메모리에서 작동할 수 있도록 하는 shmop 확장 모듈을 제공합니다. 본 확장 모듈이 제공하는 기능

C++에서 공유 메모리 및 메시지 대기열 사용 C++에서 공유 메모리 및 메시지 대기열 사용 Aug 22, 2023 pm 04:21 PM

C++에서 공유 메모리와 메시지 큐는 일반적으로 사용되는 두 가지 프로세스 간 통신 방법입니다. 이를 통해 서로 다른 프로세스 간에 데이터와 정보를 공유할 수 있어 보다 효율적인 프로그래밍이 가능해집니다. 공유 메모리는 여러 프로세스가 공유할 수 있는 특수 메모리 영역입니다. 공유 메모리를 사용하면 데이터 복사 오버헤드가 방지되고 프로세스 간 데이터 전송 지연이 줄어듭니다. C++에서 공유 메모리를 사용하려면 <sys/shm.h> 헤더 파일을 포함하고 shmget, shmat, sh를 사용해야 합니다.

다중 프로세스 프로그래밍에서 발생하는 Python 문제와 해결 방법 다중 프로세스 프로그래밍에서 발생하는 Python 문제와 해결 방법 Oct 08, 2023 pm 04:57 PM

다중 프로세스 프로그래밍에서 발생하는 Python 문제와 해당 솔루션에는 특정 코드 예제가 필요합니다. Python에서 다중 프로세스 프로그래밍은 일반적으로 사용되는 동시 프로그래밍 방법입니다. 멀티 코어 프로세서를 효과적으로 활용하고 프로그램 실행 효율성을 향상시킬 수 있습니다. 그러나 다중 프로세스 프로그래밍을 수행할 때에도 몇 가지 문제에 직면하게 됩니다. 이 문서에서는 몇 가지 일반적인 문제를 소개하고 해당 솔루션과 코드 예제를 제공합니다. 질문 1: 프로세스 간 통신 다중 프로세스 프로그래밍에서 프로세스 간 통신은 기본 요구 사항입니다. 그러나 프로세스에는 고유한 특성이 있으므로

Redis와 D 언어를 사용하여 공유 메모리 기능을 개발하는 방법 Redis와 D 언어를 사용하여 공유 메모리 기능을 개발하는 방법 Sep 22, 2023 am 09:57 AM

Redis 및 D 언어를 사용하여 공유 메모리 기능을 개발하는 방법 개요: 컴퓨터 애플리케이션의 복잡성과 데이터 처리에 대한 요구가 증가함에 따라 공유 메모리는 데이터 교환에 일반적으로 사용되는 방법이 되었습니다. Redis는 풍부한 데이터 구조와 지원을 제공하는 고성능 인 메모리 데이터베이스입니다. 이 글에서는 Redis와 D 언어를 사용하여 공유 메모리 기능을 개발하는 방법을 소개하고 구체적인 코드 예제를 첨부하겠습니다. 1단계: Redis 및 D 언어 컴파일러 설치 먼저 컴퓨터에 Redis 및 D 언어 컴파일러를 설치해야 합니다. 빨간색

Go에서 공유 메모리 고루틴을 만드는 방법은 무엇입니까? Go에서 공유 메모리 고루틴을 만드는 방법은 무엇입니까? Jun 02, 2024 am 11:32 AM

공유 메모리 고루틴은 채널을 통해 구현될 수 있습니다. 요소 유형을 지정하려면 채널을 생성하세요. 채널에 데이터를 쓰려면 고루틴을 시작하세요. 채널에서 데이터를 읽으려면 기본 고루틴의 범위 루프를 사용하세요. 쓰기 완료는 채널을 닫으면 표시됩니다.

PHP 다중 스레드 프로그래밍 실습: 다중 프로세스 통신을 위해 공유 메모리 사용 PHP 다중 스레드 프로그래밍 실습: 다중 프로세스 통신을 위해 공유 메모리 사용 Jun 29, 2023 pm 12:50 PM

PHP는 웹 개발에 널리 사용되는 스크립팅 언어입니다. 일반적으로 단일 스레드에서 실행됩니다. 그러나 일부 특정 시나리오에서는 프로그램 성능과 효율성을 향상시키기 위해 다중 스레드 프로그래밍을 사용해야 할 수도 있습니다. 이 기사에서는 PHP에서 다중 스레드 프로그래밍을 수행하고 공유 메모리를 사용하여 여러 프로세스 간의 통신을 달성하는 방법을 소개합니다. 먼저 멀티스레드 프로그래밍과 공유 메모리가 무엇인지 이해해야 합니다. 멀티스레드 프로그래밍은 프로그램이 동시에 여러 스레드를 실행할 수 있도록 하여 프로그램 실행을 향상시키는 동시 프로그래밍 방법입니다.

See all articles