PHP 기반 웹 애플리케이션을 개발할 때 문제와 프로젝트 요구 사항을 해결하는 것만으로는 충분하지 않습니다. 스토리지, 메모리, CPU 수와 같은 서버 리소스는 호스팅 가격에 영향을 미칩니다. 따라서 개발자는 웹 애플리케이션을 개발할 때 이러한 리소스를 고려해야 합니다. 그 외에도 애플리케이션은 원활하게 실행되어야 합니다. 웹 애플리케이션에서 일종의 성능 최적화를 수행하는 방법은 수백 가지가 있습니다. 다음은 PHP 성능 최적화를 위한 몇 가지 방법을 요약한 것입니다.
1. PHP 버전은 매우 중요합니다
PHP 버전 7은 PHP5보다 훨씬 빠릅니다. PHP 버전은 최초 출시 후 2년 동안 완벽하게 지원됩니다. 다음은 지원되는 PHP 버전입니다.
두 버전 간 마이그레이션 시 호환성 문제가 발생하지만, 특히 성능 향상이라는 장점이 개발 비용과 수정 시간보다 더 큽니다. 아래 버전을 사용하고 계시다면, 더 나은 성능을 위해 최신 버전의 PHP로 업그레이드하는 것을 권장합니다.
2. 작은 따옴표와 큰 따옴표의 사용이 중요합니다
이것은 개발자가 집중해야 할 마지막 사항처럼 보일 수 있지만 작은 따옴표의 사용을 증명하기 위해 많은 테스트가 수행되었습니다. 특히 더 큰 경우 루프와 문자열에 큰따옴표를 사용하는 것보다 훨씬 빠릅니다. 큰따옴표로 묶인 문자열은 문자열 자체를 표시하기 전에 먼저 일부 변수를 검색하므로 작은따옴표로 문자열을 인쇄하는 것보다 약간 느립니다. PHP 프로젝트의 성능 최적화를 고려할 때 문자열에 작은따옴표를 사용하는 것이 중요합니다.
function doubleQuotes($iterations) { doubleQuotes($iterations) { $temp_str = "";= ""; $start_time = microtime(true);= microtime(true); for ($x=0; $x<$iterations; $x++) {for ($x=0; $x<$iterations; $x++) { $temp_str .= "Hello World! ";.= "Hello World! "; }} echo "Time for doubleQuotes(): " . (microtime(true)-$start_time) . "</br>";"Time for doubleQuotes(): " . (microtime(true)-$start_time) . "</br>"; }} function singleQuotes($iterations) {function singleQuotes($iterations) { $temp_str = '';= ''; $start_time = microtime(true);= microtime(true); for ($x=0; $x<$iterations; $x++) {for ($x=0; $x<$iterations; $x++) { $temp_str .= 'Hello World! ';.= 'Hello World! '; }} echo 'Time for singleQuotes(): ' . (microtime(true)-$start_time) . '</br>';'Time for singleQuotes(): ' . (microtime(true)-$start_time) . '</br>'; }} doubleQuotes(500000);(500000); singleQuotes(500000);(500000); Time for doubleQuotes(): 0.065473079681396Time for doubleQuotes(): 0.065473079681396 Time for singleQuotes(): 0.027308940887451Time for singleQuotes(): 0.027308940887451
이 테스트부터 시작하면 작은따옴표가 있는 문자열은 큰따옴표가 있는 문자열 테스트에 비해 두 배 이상 빠르게 실행됩니다. 밀리초 단위의 차이는 사소해 보일 수 있지만 이러한 성능 향상은 분당 수백 명의 사용자가 웹 애플리케이션에 액세스하는 데 도움이 됩니다. 따라서 변수 값을 표시해야 하는 경우 큰따옴표로 표시하면 됩니다. 그렇지 않은 경우 작은따옴표로 문자열을 표시하는 것이 훨씬 빠릅니다.
3. 루프에서 카운팅 함수의 영향
루프는 주로 배열을 순회하는 데 사용되지만 루프의 조건에서 배열 요소의 수를 계산하는 데 이 함수를 사용합니다. 오버헤드가 발생합니다.
for ($x=0; $x<count($arr); $x++) { } ($x=0; $x<count($arr); $x++) { } $count = count($arr);= count($arr); for ($x=0; $x<$count; $x++) { }for ($x=0; $x<$count; $x++) { }
루프를 사용하여 배열을 반복하는 가장 좋은 방법은 배열의 요소 수를 한 번 저장한 다음 해당 변수를 루프 조건에 사용하는 것입니다. for 루프나 루프에서 count 함수를 사용하면 루프가 반복될 때마다 프로그램이 배열을 다시 계산하므로 각 반복에서 프로세스 수가 증가합니다. 개발자가 루프에서 count를 사용해야 하는 유일한 방법은 루프 내부에서 배열을 조작하는 것입니다.
4. 변수 닫기 또는 설정 해제
데이터베이스를 쿼리할 때 연결을 설정해야 하는 방법 중 하나는 연결 변수를 선언하는 것입니다. 우리 모두는 사용되거나 선언된 모든 변수가 메모리를 사용한다는 것을 알고 있으므로 쿼리 또는 모든 쿼리가 완료된 후에 연결을 닫는 것이 좋습니다. ,
$conn = new mysqli($servername, $username, $password, $dbname);= new mysqli($servername, $username, $password, $dbname); //查询//查询 $conn->close();->close(); $myfile = fopen("sample-file.txt", "r") or die("Unable to open file!");= fopen("sample-file.txt", "r") or die("Unable to open file!"); //读取内容//读取内容 fclose($myfile);($myfile);
파일을 열 때와 마찬가지로 파일을 읽거나 쓴 후에는 연결을 처리하는 변수를 닫아야 합니다. 여러 사람이 동일한 웹 애플리케이션 요청에 액세스하더라도 연결을 닫으면 메모리 사용량이 크게 절약됩니다.
5. 정적 메서드 또는 속성은 더 적은 리소스를 사용합니다.
클래스의 정적 메서드는 사용될 때 해당 클래스를 인스턴스화할 필요가 없습니다. 액세스하기 전에 인스턴스화해야 하는 공용 메서드나 속성과 달리 정적 메서드는 직접 호출할 수 있습니다. 메소드가 하나만 있는 클래스가 다른 클래스에서 많이 호출되는 경우 이 메소드를 정적 메소드로 선언해야 합니다. 변수 또는 클래스 인스턴스화에 메모리가 필요하므로 이렇게 하면 애플리케이션의 메모리 사용량이 줄어듭니다.
6. SQL 쿼리 최적화
연결을 사용하면 코드가 짧아질 뿐만 아니라 성능 향상도 중요합니다. 초보자는 일반적으로 첫 번째 테이블에서 선택 쿼리를 수행한 다음 첫 번째 선택 쿼리의 결과를 기반으로 또 다른 선택 쿼리를 수행합니다.
$query1 = mysql_query("SELECT id FROM users");= mysql_query("SELECT id FROM users"); while ($row = mysql_fetch_assoc($query1)) {while ($row = mysql_fetch_assoc($query1)) { $query2 = mysql_query("SELECT * FROM user_info WHERE user_id = {$row['id']}");= mysql_query("SELECT * FROM user_info WHERE user_id = {$row['id']}"); }}
또한 여러 데이터베이스 쿼리가 포함된 HTTP 요청은 웹 개발에서 절대 금물입니다. 조인을 사용하여 관련 데이터베이스 테이블을 쿼리할 수 없는 경우 데이터베이스를 정규화해야 합니다.
SQL 쿼리로 성능을 최적화하는 또 다른 방법은 특정 열에 인덱스를 추가하는 것입니다. 이렇게 하면 인덱스 열을 사용하여 레코드를 검색하는 것이 더 빨라집니다. 인덱스는 일반 열에 비해 추가 저장 공간이 필요하지만 레코드 검색 속도가 빠르다는 것은 좋은 사용자 경험입니다. 일반적으로 인덱싱이 필요한 열은 JOIN, ORDER BY, GROUP BY 및 WHERE 절에 사용되는 열입니다.
SELECT * FROM employees WHERE address LIKE '%Kansas City%'* FROM employees WHERE address LIKE '%Kansas City%'
쿼리에서 와일드카드를 사용하면 확실히 결과를 필터링하기가 더 쉬워지지만 이러한 종류의 쿼리는 웹 애플리케이션 속도를 저하시키는 주요 원인 중 하나입니다. 문자열을 사용하여 도시 및 국가와 같이 반복되는 값을 저장하는 대신 이러한 유형의 필드를 정수로 저장하고 다른 데이터베이스 테이블을 사용하여 이러한 정수 및 해당 문자열 값을 저장하십시오. 이러한 방식으로 이러한 필드를 사용하여 검색하려면 이제 문자열 대신 정수가 필요합니다.
SELECT id, first_name, last_name FROM employees, first_name, last_name FROM employees
如果可能,如果您不打算使用数据库表的所有列,则只指定要使用的SELECT查询中的哪些列而不是SELECT *。查询返回的列越多,内存和处理能力就越大。
7、缩小CSS和JavaScript
性能优化的另一种方法是缩小JS和CSS代码; 这将使人们无法阅读,但当我们谈论生产中的Web应用程序时,代码的可读性不是优先事项。同时缩小代码会减小文件的大小,从而缩短加载时间。浏览器可以快速解析这些文件,因为省略了注释和空格,从而减少了忽略它的过程。当混淆代码使其无法被人阅读时,只需对需要保护的代码进行模糊处理,因为此过程可能会破坏代码。
8、使用CDN优化性能
Web应用程序通常使用Bootstrap和jQuery等库,加载这些文件的最佳方式是通过内容交付网络,如Cloudflare。要优化Web应用程序的性能,请利用内容交付网络(CDN)。我们的大多数图像,CSS或JS文件都是静态的,因此在靠近用户所在位置的服务器上维护内容的缓存副本是明智的。通过这种方式,数据传播的距离更短,执行速度更快,这将减少应用程序的延迟。需要性能改进的Web应用程序必须考虑使用CDN来下载资源。CDN允许用户从更近的源下载内容,而不是从托管整个应用程序的位置加载内容,这将极大地影响应用程序的加载时间。
9、Web应用程序流量
另一件需要考虑的事情是流量以及应用程序响应用户请求的速度。在Web应用程序中,常见问题是流量,访问系统的用户数量以及服务器处理特定请求的请求和响应的能力。比如Stackify Retrace可以监控应用程序的流量。
Retrace确保您的应用程序完美地满足您的需求。Retrace支持Microsoft Azure,Amazon AWS和Google GCP,以最大限度地提高基于云的监控功能,从而确保应用程序的质量。
위 내용은 PHP 성능을 최적화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!