2010-06-13 2 views
0

웹 페이지에서 C++로 작성된 외부 라이브러리로 전화를 걸고 결과를 표시해야합니다. 플랫폼은 Linux, Apache, PHP입니다.PHP에서 외부 라이브러리를 호출하십시오. 빠른 무엇입니까 : 임원 또는 확장?

나의 현재 아이디어는 내 라이브러리/프로그램을 호출 할 PHP 서비스를 사용하는 것입니다. 나는 이것을 할 수있는 두 가지 방법이 있음을 발견했다 : 1) PHP 'exec'함수 사용 2) PHP 확장자 쓰기

나는 더 효과적일까요? 빨리? 서버를 적게로드합니까?

아마도 초당 4 회의 전화를해야하므로 가능한 한 최적의 상태가되고 싶습니다.

P. 웹 페이지에서 C++ 라이브러리 나 프로그램을 호출하는 다른 (보다 효과적인) 방법을 알고 있다면 알려주십시오.

고마워,
로부스타

+2

초당 4 회의 통화는 특별한 것이 아닙니다. – Artefacto

답변

7

연장은 이론적으로 새로운 프로세스를 생성하는 오버 헤드를 피할 수 있기 때문에 더 빠릅니다. 또한 "깨끗한"솔루션이기도합니다 (어색한 프로그램 인수가 빠져 나오지 않고 문자열 만이 아닌 임의의 PHP 값을 파싱 할 수 있습니다).

그러나 이미 해당 라이브러리를 사용하는 명령 줄 프로그램이있는 경우 확장 프로그램을 작성하는 대신 실행하는 것이 더 쉬울 것입니다. 당신은 단지 초당 4 개 통화를 할 경우 라이브러리가 PHP 확장에 저장 지속 (크로스 요청) 상태를함으로써 방지 할 수 있습니다 고가의 초기화를 요구하지 않는, 성능 현명한, 당신이 사용하는 방법 무관심하다는

참고.

4

경영진은 컴파일 된 PHP 확장을 호출하는 것보다의 definetly 느립니다. Ext_skel은 친한 친구입니다.

편집 : exec에 대한 이론적 인 정보는 기본 제공되는 확장명보다 느립니다. strace를 실행하고 PHP 스크립트에서 exec가 얼마나 많은 syscalls를 확인하고 컴파일 된 확장 프로그램을 호출하는지 확인하십시오.

시스템 : VM웨어 워크 스테이션, C2DUO E8400 2GB의 RAM

** 실행 된 4 회 :

시간 ./a.php (EXEC)

여기

몇 가지 벤치 마크 실제 0m0.944s
사용자 0m0.700s
에 sys 0m0.244s

시간 ./a :시간 ./b.php (PHP 확장)

실제 0m0.268s는
사용자는
에 sys 0m0.056s

** 실행 된 1000 배를 0m0.212s. PHP (EXEC)

실제 3m47.042s
사용자 2m48.239s
SYS의 0m56.784s

,

시간 ./b.php (PHP 확장)

실제 3m36.631s
사용자 2m46.922s
SYS의 0m49.627s

나는이 어떤 설명이 필요하다고 생각하지 않습니다. 컴파일 된 확장 프로그램이 더 빨리 실행되고 친환경적이며 CPU 시간이 단축됩니다. 더 나은 것으로 간주됩니다. 또한 확장을 사용하면 리소스를 재사용 할 수 있습니다. 같은 이미지에서 10 가지 버전을 만들고 싶다면 어떻게해야할까요? 그런 다음 매번 new imagick('filename'); 개체를 다시 만들 필요가 없습니다.

시간 ./bx.php (PHP EXTENSION 재사용 RESOURCE)

실제 0m3.712s
사용자가 0m3.552s
에 sys 0m0.156s

스크립트 내용 :

#!/usr/bin/php5 
<?php 

for ($i=0; $i < 1000; $i++) 
{ 
    exec('/usr/bin/convert -thumbnail 150 src1.jpg dst.jpg'); 
} 

?> 

스크립트 B 내용 :

#!/usr/bin/php5 
<?php 

for ($i=0; $i < 1000; $i++) 
{ 
    $img = new imagick('src1.jpg'); 
    $img->thumbnailImage(150, null); 
    $img->writeImage('dst.jpg'); 
} //for 

?> 

스크립트 BX 내용 :

#!/usr/bin/php5 
<?php 

$img = new imagick('src1.jpg'); 
for ($i=0; $i < 1000; $i++) 
{ 
    $img->thumbnailImage(150, null); 
    $img->writeImage('dst.jpg'); 
} //for 

?> 

스크립트 포크와 스택 트레이스 (단순 실행) : 포크와 LINK

스크립트 B의 스택 트레이스 (단순 실행) : 는 LINK

+0

아니요 항상 느린 것은 아닙니다. 물론 호출하는 데 더 많은 대기 시간이 필요하지만 다른 곳에서는 성능이 저하 될 수 있습니다. 세션으로 실행하면 본질적으로 느린 경우를 고려하기에 앞서야합니다. 적어도 Artefacto는 그의 반응을 '이론적으로'인정했습니다. 그러나 우리는 코드가 정보에 근거한 추측을 할 수 있도록하는 것에 대해 많은 것을 알 필요가 있습니다. – symcbean

+1

벤치 마크 노력에 +1. 내 "이론적으로"한정자는 "나는 어떤 테스트도하지 않았다"라고 읽어야합니다 : p – Artefacto

1

PHP 확장 기능 (exec가 너무 느립니다)을 작성하는 번거 로움을 줄이려면 사용중인 라이브러리 (예 : XML-RPC 또는 SOAP/REST)의 웹 서비스를 작성하고 PHP 코드에서 이것을 호출하십시오.

이 (간단하게 당신이 만든 요청을 기록하고이를 재생)뿐만 아니라 쉽게 별도의 디버그에보다 쉽게해야한다 (여러 가지 이유로 다른 호스트에 한 부분을 실행해야합니다 : P)에 관해서는

+0

웹 서비스는 exec를 호출하는 것보다 훨씬 느립니다. –

+0

왜 웹 서비스 여야합니까? 그것은 어떤 종류의 데몬 일 수 있습니다. – symcbean

0

내가 WebService에 관한 것은 exe 프로그램보다 훨씬 느리다. 하지만 플랫폼의 장점을 가지고있다. ZeisS.

그리고 나는 Emil Vikstrom과 강력하게 동의합니다. 가정 (시스템)에서 손님 (OS)이 손님 (웹 서비스)보다 가족 구성원 (exe)에 더 많은 선호를 줄 것이라고 가정합니다. 재귀 함수의 경우 exe는 웹 서비스보다 훨씬 빠르게 실행됩니다.

0

속도 대 이동성. PHP에 대해 다른 라이브러리를 링크하는 경우 업데이트를 유지해야합니다. 따라서 빌드 시스템 또는 배포 용 사용자 정의 패키지가 필요합니다. 이것은 실제로 큰 문제가 아닙니다. 그러나 사용 가능한 경우 명령 줄 유틸리티를 사용하는 것이 더 간단합니다.

그래서 세션과 같은 방식으로 사용할 수있는 라이브러리 (다중 호출, 적응 환경)라면 반드시 래퍼를 만들어야합니다. 초당 10 번 이상 호출하지 않으면 속도 차이가 미미합니다. execve() 메소드로 이동하십시오. 유닉스 방식이기 때문에 애플리케이션에 평생 기대치가 있다면 사실 더 강력해진다.

관련 문제