찾다
백엔드 개발PHP 튜토리얼Baidu 엔지니어들이 PHP 기능의 구현 원리와 성능 분석에 대해 이야기합니다. (1)_php 기술

머리말

모든 언어에서 함수는 가장 기본적인 구성 요소입니다. PHP 함수의 특징은 무엇입니까? 함수 호출은 어떻게 구현되나요? PHP 기능의 성능은 어떻습니까? 사용법에 대한 제안이 있습니까? 이 기사에서는 구현을 이해하면서 PHP 프로그램을 더 잘 작성하기 위해 원리를 분석하고 이를 실제 성능 테스트와 결합하여 이러한 질문에 대답하려고 합니다. 동시에 몇 가지 일반적인 PHP 기능이 소개됩니다.

PHP 기능 분류

PHP에서는 함수를 가로로 나누면 사용자 함수(내장 함수)와 내부 함수(내장 함수) 두 가지로 구분됩니다. 전자는 프로그램 내에서 사용자가 맞춤화한 일부 함수와 메소드이고, 후자는 PHP 자체에서 제공하는 다양한 라이브러리 함수(예: sprintf, array_push 등)입니다. 사용자는 나중에 소개될 확장 메서드를 통해 라이브러리 함수를 작성할 수도 있습니다. 사용자 기능은 함수(function)와 메소드(class method)로 나눌 수 있습니다. 본 글에서는 이 세 가지 기능을 각각 분석하고 테스트하겠습니다.

PHP 기능 구현

PHP 함수는 최종적으로 어떻게 실행되나요?
이 질문에 대답하기 위해 먼저 PHP 코드를 실행하는 과정을 살펴보겠습니다.

그림 1에서 볼 수 있듯이 PHP는 일반적인 동적 언어 실행 프로세스를 구현합니다. 코드 조각을 얻은 후 어휘 분석 및 구문 분석과 같은 단계를 거친 후 소스 프로그램이 명령어(opcode)로 변환됩니다. 그런 다음 ZEND 가상 머신은 이러한 명령을 순서대로 실행하여 작업을 완료합니다. PHP 자체가 C로 구현되어 있기 때문에 최종적으로 호출되는 함수는 모두 C 함수입니다. 사실 PHP는 C로 개발된 소프트웨어라고 볼 수 있습니다. 위의 설명에서 PHP의 함수 실행이 호출을 위한 opcode로 변환된다는 것을 보는 것은 어렵지 않습니다.

각 기능에 대해 zend는 다음 데이터 구조로 설명됩니다

코드 복사 코드는 다음과 같습니다.

typedef Union _zend_function {
zend_uchar 유형; /* 이 구조체의 첫 번째 요소여야 합니다. */
구조체 {
zend_uchar 유형; /* 사용되지 않음 */
char *함수_이름
zend_class_entry *범위
zend_uint fn_flags
Union _zend_function *프로토타입
zend_uint num_args
zend_uint 필수_num_args
zend_arg_info *arg_info
zend_bool pass_rest_by_reference
부호 없는 문자 반환_참조
} 일반적;

zend_op_array op_array
zend_internal_function 내부_함수
} zend_function;


typedef struct _zend_function_state {
해시테이블 *function_symbol_table
zend_function *함수
무효 *예약됨[ZEND_MAX_RESERVED_RESOURCES]
} zend_function_state;

유형은 함수 유형(사용자 함수, 내장 함수, 오버로드 함수)을 나타냅니다. 공통에는 함수 이름, 매개변수 정보, 함수 플래그(일반 함수, 정적 메서드, 추상 메서드) 등 함수의 기본 정보가 포함됩니다. 또한, 사용자 기능에 대해서는 내부 변수 등을 기록하는 기능 심볼 테이블도 있는데 이에 대해서는 뒤에서 자세히 설명한다. Zend는 대규모 해시 테이블인 전역 function_table을 유지 관리합니다. 함수가 호출되면 먼저 함수 이름을 기반으로 테이블에서 해당 zend_function을 찾습니다. 함수를 호출할 때 가상 머신은 유형에 따라 호출 방법을 결정합니다. 함수 유형에 따라 실행 원칙이 다릅니다.

내장 기능

내장 함수는 본질적으로 실제 C 함수입니다. 각 내장 함수에 대해 PHP는 최종 컴파일 후에 zif_xxxx라는 함수로 확장됩니다. 예를 들어, 공통 sprintf는 맨 아래 계층의 zif_sprintf에 해당합니다. Zend가 실행 중일 때 내장 함수를 찾으면 단순히 전달 작업을 수행합니다.
Zend는 매개변수 획득, 배열 작업, 메모리 할당 등을 포함하여 호출을 위한 일련의 API를 제공합니다. 내장 함수의 매개변수는 zend_parse_parameters 메소드를 통해 얻습니다. 배열, 문자열 등의 매개변수에 대해 zend는 얕은 복사를 구현하므로 이 효율성이 매우 높습니다. PHP 내장 함수의 경우 추가 전달 호출만 제외하면 효율성은 해당 C 함수의 효율성과 거의 동일하다고 말할 수 있습니다.

내장 함수는 이를 통해 PHP에 동적으로 로드됩니다. 사용자는 필요에 따라 해당 기능을 작성할 수도 있는데, 이를 흔히 확장이라고 부릅니다. ZEND는 확장을 위한 일련의 API를 제공합니다

사용자 기능

PHP를 통해 구현되는 사용자 정의 함수는 내장 함수에 비해 실행 프로세스와 구현 원리가 전혀 다릅니다. 위에서 언급했듯이 우리는 PHP 코드가 실행을 위해 opcode로 변환된다는 것을 알고 있으며 사용자 함수도 예외는 아닙니다. 실제로 각 함수는 opcode 세트에 해당하며 이 명령 세트는 zend_function에 저장됩니다. 따라서 사용자 함수 호출은 궁극적으로 일련의 opcode 실행에 해당합니다.

》》지역변수 저장 및 재귀 구현

함수 재귀는 스택을 통해 완성된다는 것을 알고 있습니다. PHP에서는 이를 달성하기 위해 유사한 방법이 사용됩니다. Zend는 활성 기호 테이블(active_sym_table)을 각 PHP 함수에 할당하여 현재 함수의 모든 지역 변수 상태를 기록합니다. 모든 기호 테이블은 함수가 호출될 때마다 새로운 기호 테이블이 할당되어 스택에 푸시되는 형태로 유지됩니다. 호출이 끝나면 현재 기호 테이블이 스택에서 팝됩니다. 이는 상태 보존 및 재귀를 달성합니다.
스택 유지 관리를 위해 zend는 여기에서 최적화를 수행했습니다. 스택을 시뮬레이션하기 위해 길이 N의 정적 배열을 사전 할당합니다. 정적 배열을 통해 동적 데이터 구조를 시뮬레이션하는 이 방법은 각 호출로 인한 메모리 할당을 방지하는 데도 사용됩니다. ZEND는 함수 호출이 끝날 때 현재 스택의 맨 위에 있는 기호 테이블 데이터를 정리합니다. 정적 배열의 길이가 N이기 때문에 함수 호출 수준이 N을 초과하면 프로그램은 스택 오버플로를 일으키지 않습니다. 이 경우 zend는 심볼 테이블을 할당하고 파괴하므로 성능이 많이 저하됩니다. zend에서 N의 현재 값은 32입니다. 따라서 PHP 프로그램을 작성할 때 함수 호출 수준이 32개를 초과하지 않는 것이 가장 좋습니다. 물론 웹 애플리케이션이라면 함수 호출 수준 자체가 깊을 수도 있다.

》》매개변수 전송 매개변수를 얻기 위해 zend_parse_params를 호출하는 내장 함수와 달리 사용자 함수의 매개변수 획득은 명령어를 통해 완료됩니다. 함수가 갖는 매개변수의 수는 명령어의 수에 해당합니다. 구현에 있어서는 일반적인 변수 할당입니다. 위의 분석에서 알 수 있듯이 내장 함수와 비교하면 스택 테이블이 자체적으로 유지되고 각 명령이 C 함수로 실행되므로 사용자 함수의 성능이 상대적으로 훨씬 저하됩니다. 구체적인 비교 분석은 나중에. 따라서 함수에 해당 PHP 내장 함수가 있는 경우 이를 구현하기 위해 함수를 직접 다시 작성하지 마십시오.

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
百度开源消息中间件BifroMQ,支持高性能物联网连接和消息处理百度开源消息中间件BifroMQ,支持高性能物联网连接和消息处理Jul 15, 2023 pm 08:33 PM

7月14日消息,百度昨日宣布开源其旗下的MQTTBroker消息中间件BifroMQ,该消息中间件是由Java实现,具有高性能和分布式的特点。据称,BifroMQ是百度智能云物联网核心套件IoTCore的基础技术之一。BifroMQ采用了Serverless架构,并且无缝集成了原生的多租户支持。该消息中间件源自百度物联网团队多年的技术积累,旨在支持构建大规模的物联网设备连接和消息系统。据小编了解,BifroMQ采用了负载独立子集群设计,可以高效处理连接会话、消息转发和消息存储等工作负载。各子集群

PHP实现对接百度智能分类接口的简单指南PHP实现对接百度智能分类接口的简单指南Aug 13, 2023 pm 12:13 PM

PHP实现对接百度智能分类接口的简单指南近年来,随着人工智能的快速发展,智能分类技术被广泛应用于许多领域。百度智能分类接口就是其中一种应用,它可以根据传入的文本数据对其进行分类,帮助我们更好地理解文本的内容。本文将介绍如何使用PHP语言对接百度智能分类接口,并给出相应的代码示例。一、准备工作注册百度开发者账号并登录。创建一个应用并获取应用的APIKey和S

PHP实现对接百度语音识别接口的步骤与注意事项PHP实现对接百度语音识别接口的步骤与注意事项Aug 13, 2023 pm 01:57 PM

PHP实现对接百度语音识别接口的步骤与注意事项前言:随着人工智能技术的快速发展,语音识别技术也逐渐成熟并被广泛应用。百度语音识别接口是一款强大的云端语音识别服务,提供丰富的功能和灵活的配置选项,方便开发者根据自己的需求进行定制化开发。本文将利用PHP语言来实现对接百度语音识别接口的操作步骤,并对注意事项进行详细介绍。步骤一:申请百度语音识别接口首先,我们需要

百度网盘崩溃问题已解决并致歉:现已修复,请用户尝试重新登录百度网盘崩溃问题已解决并致歉:现已修复,请用户尝试重新登录Aug 10, 2023 pm 02:25 PM

据本站8月9日16时许报道,百度旗下产品出现了大规模故障,例如百度网盘在使用过程中出现了视频播放失败的情况,其他业务也有用户反映无法打开或崩溃的现象。经过本站的调查,发现是由于百度CDN服务异常所致百度网盘回应称,对此问题十分抱歉并正在紧急修复中,请耐心等待,感谢您的理解五分钟后,百度网盘回复说问题已解决,请您尝试重新登录,感谢您的支持CDN(内容分发网络)通过将源站内容分发至全球各地的加速节点,使用户在请求网站资源时能够被调度至距离最近的加速节点,从而直接获得所需内容,提高用户对网站资源的访问

PHP如何对接百度文心一言接口?PHP如何对接百度文心一言接口?Aug 13, 2023 pm 09:27 PM

PHP如何对接百度文心一言接口?百度文心一言接口是一个提供随机返回一句文心话的接口,使用起来非常简单。本文将介绍PHP如何对接百度文心一言接口,并提供代码示例。首先,我们需要申请百度文心一言接口的访问权限。在百度开放平台上创建一个应用,并获取到相应的APIKey。接下来,我们可以使用PHP中的cURL库来发送HTTP请求并获取接口返回的数据。下面是一个简单

使用Python实现百度图像识别API对接教程使用Python实现百度图像识别API对接教程Aug 12, 2023 pm 07:58 PM

使用Python实现百度图像识别API对接教程一、介绍随着人工智能的发展,图像识别技术已广泛应用于各个领域。而百度图像识别API是一款强大而易用的图像识别工具,可以帮助开发者快速实现图像分类、物体检测、图像搜索等功能。本文将详细介绍如何使用Python语言对接百度图像识别API,并给出代码示例。二、准备工作注册百度云账号首先,你需要在百度云官网注册一个账号,

Python编写代码实现百度人脸识别API对接,实现人脸特征分析Python编写代码实现百度人脸识别API对接,实现人脸特征分析Aug 27, 2023 am 11:01 AM

Python编写代码实现百度人脸识别API对接,实现人脸特征分析人脸识别技术近年来快速发展,广泛应用于安全监控、用户认证、人脸搜索等领域。百度人脸识别API是一种强大的工具,提供了丰富的人脸特征分析功能。本文将介绍如何使用Python编写代码,通过对接百度人脸识别API实现人脸特征分析。首先,我们需要准备好Python开发环境。建议使用Python3.x版

“文心一言”正式发布,百度股价大跳水!“文心一言”正式发布,百度股价大跳水!Mar 16, 2023 pm 05:02 PM

3月16日,百度「文心一言」发布了!「文心一言」的整场发布会,总体感觉就是太过潦草了,感觉准备的不够充分,发布会有点为了开发布会而开发布会了。

See all articles

핫 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를 무료로 생성하십시오.

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.