게시자: ShiningRay, 2006년 4월 3일
Edwin Martin < [email protected] >
번역자: ShiningRay @ Nirvana Studio
저는 지난 4년 동안 PHP 애플리케이션을 개발해 왔습니다. PHP는 작성하기가 정말 쉽습니다. 그러나 PHP에는 매우 심각한 결함도 있습니다.
아래에서는 PHP가 소규모 아마추어 웹사이트보다 큰 웹사이트에 적합하지 않은 이유를 설명하겠습니다.
1. 재귀에 대한 지원 부족 재귀는 함수가 자신을 호출하는 메커니즘입니다. 이는 복잡한 것을 매우 간단한 것으로 바꿀 수 있는 강력한 기능입니다. 재귀를 사용하는 예는 퀵 정렬(quicksort)입니다. 불행하게도 PHP는 재귀를 잘 수행하지 못합니다. PHP 개발자인 Zeev는 다음과 같이 말했습니다. "PHP 4.0(Zend)은 밀도가 높은 데이터에 대해 힙 접근 방식이 아닌 스택 접근 방식을 사용합니다. 이는 허용할 수 있는 재귀 함수의 수가 다른 언어보다 훨씬 덜 제한된다는 것을 의미합니다. 버그 1901을 참조하세요." . 이것은 매우 나쁜 변명입니다. 모든 프로그래밍 언어는 좋은 재귀 지원을 제공해야 합니다.
2. 많은 PHP 모듈은 스레드로부터 안전하지 않습니다. 몇 년 전 Apache는 웹 서버 버전 2.0을 출시했습니다. 이 버전은 소프트웨어의 한 부분이 동시에 여러 부분을 실행할 수 있는 멀티스레딩 모드를 지원합니다. PHP의 발명가는 PHP의 핵심은 스레드로부터 안전하지만 비핵심 모듈은 그렇지 않을 수 있다고 말합니다. 그러나 10번 중 9번은 이 모듈을 PHP 스크립트에서 사용하고 싶지만 이로 인해 스크립트가 Apache의 다중 스레드 모드와 호환되지 않게 됩니다. 이것이 바로 PHP 팀이 Apache 2의 다중 스레드 모드에서 PHP를 실행하는 것을 권장하지 않는 이유입니다. PHP의 열악한 멀티스레드 모드 지원은 Apache 2가 여전히 인기가 없는 이유 중 하나로 자주 언급됩니다.
이 토론을 읽어보십시오: Slashdot: Apache 2를 거부하는 사이트?
3. 비즈니스상의 이유로 PHP가 작동하지 않습니다. 캐싱을 사용하면 PHP 성능을 500% 향상시킬 수 있습니다[벤치마크 참조]. 그렇다면 왜 PHP에는 캐싱이 내장되어 있지 않습니까? PHP 제조업체인 Zend는 자체 Zend Accelerator를 판매하므로 당연히 상용 제품을 버리고 싶지 않습니다.
그러나 또 다른 대안이 있습니다: APC(Zend는 나중에 무료 가속기-번역기인 Zend Optimizer를 출시했습니다.)
4. 네임스페이스 없음 누군가가 파일을 읽기 위해 PHP 모듈을 만들었다고 상상해 보십시오. 모듈의 한 함수는 읽기라고 합니다. 그러면 다른 사람의 모듈이 웹페이지를 읽을 수 있으며 여기에는 읽기 함수도 포함되어 있습니다. 그러면 우리는 이 두 모듈을 동시에 사용할 수 없습니다. 왜냐하면 PHP는 사용자가 어떤 기능을 사용하고 싶은지 모르기 때문입니다.
하지만 아주 간단한 해결책이 있는데, 바로 네임스페이스입니다. 누군가가 이 기능을 PHP5에 추가하자고 제안했지만 불행하게도 그는 그렇게 하지 않았습니다. 이제 네임스페이스가 없으면 이름 충돌을 피하기 위해 각 함수 앞에 모듈 이름을 붙여야 합니다. 이로 인해 xsl_xsltprocessor_transform_to_xml과 같은 함수 이름이 엄청나게 길어져 코드를 작성하고 이해하기가 어려워집니다.
5. 비표준 날짜 형식 문자 많은 프로그래머는 UNIX 및 C 언어에서 유래된 날짜 형식 문자에 익숙합니다. 여러 다른 프로그래밍 언어가 이 표준을 채택했지만 이상하게도 PHP에는 완전히 호환되지 않는 날짜 형식 문자 세트가 있습니다. C에서는 "%j"가 올해의 날짜를 나타내고, PHP에서는 해당 월의 날짜를 나타냅니다. 그러나 상황을 더욱 혼란스럽게 만드는 것은 Smarty(인기 있는 PHP 템플릿 엔진)의 strftime 함수와 date_format 함수가 C/UNIX 형식 문자를 사용한다는 것입니다.
6. 혼란스러운 라이센스 PHP가 무료라고 생각할 수도 있으며 매뉴얼에 언급된 모든 PHP 모듈도 마찬가지입니다. 잘못된! 예를 들어, PHP에서 PDF 파일을 생성하려는 경우 설명서에서 PDF와 ClibPDF라는 두 가지 모듈을 찾을 수 있습니다. 그러나 이 두 가지 모두 상업적으로 라이센스가 부여되었습니다. 따라서 사용하는 모든 모듈에 대해 해당 라이센스에 동의해야 합니다.
7. 일관되지 않은 함수 명명 규칙. 일부 함수 이름은 여러 단어로 구성됩니다. 일반적으로 단어 조합에는 세 가지 습관이 있습니다:
직접 접합: getnumberoffiles
밑줄로 구분: get_number_of_files
낙타의 법칙: getNumberOfFiles
대부분의 언어의 경우 다음 중 하나를 선택하세요. 하지만 PHP가 사용됩니다.
예를 들어, 일부 특수 문자를 HTML 엔터티로 변환하려면 htmlentities(단어 직접 연결) 함수를 사용합니다. 반대 기능을 사용하려면 동생인 html_entity_decode를 사용해야 합니다. 특별한 이유로 이 함수 이름에는 밑줄로 구분된 단어가 있습니다. 어떻게 이런 일이 일어날 수 있습니까? strpad라는 기능이 있다는 걸 아시나요? 아니면 str_pad인가요? 매번 기호가 무엇인지 확인해야 하거나 오류가 발생할 때까지 기다려야 합니다. 함수는 대소문자를 구분하지 않으므로 PHP의 경우 rawurldecode와 RawUrlDecode 간에 차이가 없습니다. 둘 다 사용되어 다르게 보이고 독자를 혼란스럽게 하기 때문에 이는 또한 나쁩니다.
8. 마법의 인용문 마법의 인용문은 SQL 주입 공격으로부터 PHP 스크립트를 보호할 수 있습니다. 이것은 좋다. 그러나 어떤 이유로 인해 php.ini에서 이 구성을 끌 수 있습니다. 따라서 유연한 스크립트를 작성하려면 항상 매직 참조가 켜져 있는지 꺼져 있는지 확인해야 합니다. 이러한 "기능"은 프로그래밍을 더 쉽게 만들어 주지만 실제로는 프로그래밍을 더 복잡하게 만듭니다.
9. 표준 프레임워크의 부족 전체 프레임워크 없이 성장하는 웹사이트는 결국 유지 관리의 악몽이 될 것입니다. 프레임워크를 사용하면 많은 작업이 더 쉬워집니다. 현재 가장 널리 사용되는 프레임워크 모델은 프레젠테이션 계층, 비즈니스 로직 및 데이터베이스 액세스가 분리된 MVC 모델입니다.
많은 PHP 웹사이트는 MVC 모델을 사용하지 않습니다. 그들은 심지어 프레임도 갖고 있지 않습니다. 지금도 일부 PHP 프레임워크가 있으며 직접 작성할 수 있습니다. PHP에 관한 기사와 매뉴얼은 프레임워크를 한 마디도 개선하지 않습니다. JSP 개발자는 Struts와 같은 프레임워크를 사용하고 ASP 개발자는 .Net을 사용하지만 이러한 개념은 PHP 개발자가 널리 이해하는 것 같습니다. 이는 PHP가 실제로 얼마나 전문적인지 보여줍니다.
요약
문제가 무엇인가요?
매우 작은 프로젝트의 경우 매우 만족스러운 프로그래밍 언어가 될 수 있습니다. 그러나 더 크고 복잡한 프로젝트의 경우 PHP는 약점을 드러냅니다. 계속 탐색하다 보면 제가 언급한 몇 가지 문제에 대한 해결책을 찾을 수 있을 것입니다. 그렇다면 해결책이 알려지면 이를 고치는 것이 어떨까요? 또한 매뉴얼에 이러한 수정 사항이 언급되지 않은 이유는 무엇입니까?
오픈소스 언어가 인기가 많다는 것은 좋은 일이다. 하지만 안타깝게도 훌륭한 언어는 아닙니다. 언젠가는 모든 문제가 해결되고(어쩌면 PHP6에서?) 오픈 소스이면서 사용하기 쉬운 오픈 소스 언어를 갖게 되기를 바랍니다.
이제 5개 이상의 스크립트 페이지로 프로젝트를 시작하려면 C#/ASP.Net 또는 Java/JSP를 고려하는 것이 좋으며 Python도 더 나은 선택일 수 있습니다.
이 기사의 출처: http://workgroup.cn/CS/blogs/php/archive/2006/06/29/1354.aspx