2012-03-30 2 views
14

PHP 스크립트에서 수학적 계산이 많이 발생합니다. 시간이 많이 걸릴 수 있습니다. PHP에서 C++로 데이터를 전달할 수 있는지, C++로 계산 한 다음 결과를 다시 PHP로 전달할 수 있는지 궁금합니다.PHP와 C++이 서로간에 데이터를 전달할 수 있습니까?

P. 나는 C++을 잘 못합니다.

+2

가장 쉬운 방법은 단순히 C++ 실행 파일을 컴파일하고 PHP에서 호출하는 것입니다. –

+0

어떤 기능을 사용합니까? 또한, PHP는 C++에 데이터를 어떻게 전달합니까? –

+0

인수와 함께 호출하십시오. 비록 main()의 리턴 값을 알려줄 것이 있다면 나는 확신하지 못한다. 편집 :'exec'처럼 그 능력을 가지고있는 것 같습니다. – chris

답변

19

You can write a PHP module, 이는 a piece of C code that exposes a new built-in이며, PHP 인터프리터의 기능입니다. 이것은 exec()을 통해 두 번째 프로세스를 돌리는 것보다 훨씬 빠릅니다.

그러나 이러한 모듈은 작성하기가 어렵고 빌드 도구가 어색하기 때문에 PHP와 C 사이에서 매개 변수를 앞뒤로 전달할 때 메모리 할당과 참조 계산에 많은주의가 필요합니다. 또한 C는 C++이 아니므로 함수를 PHP로 내보내려면 C++ 코드 주위에 extern C 레이어가 필요합니다. (또는 C++ 대신 C로 확장 기능을 작성하십시오.)

따라서 속도 요구 사항이 매우 엄격하지 않으면 exec 또는 proc_open을 사용하고 파일 포인터를 통해 데이터를 쉽게 전달할 수 있습니다. 이는 표준 입력을 읽고 표준 출력으로 보내는 C++ 프로그램을 작성하는 것과 같습니다.

3

이렇게하면 성능이 중요한 코드의 성능을 향상시킬 수있는 일반적인 솔루션입니다. C++에서 명령 줄 응용 프로그램을 만들고 PHP의 exec 명령 (또는 비슷한 명령)을 사용하여 실행할 수 있습니다.

데이터 전달과 관련하여 몇 가지 옵션이 있습니다. 데이터가 많은 경우 PHP를 사용하여 파일에 저장하고 C++에서 해당 파일에 액세스 할 수 있습니다. 데이터가 적 으면 C++ 프로그램을 실행할 때 명령 행 인수를 전달하면됩니다.

0

C++로 실행 파일을 만듭니다. proc_code을 사용하여 해당 실행 파일로 /에서 데이터를 전달하고 해당 실행 파일을 가져 와서 계산을 수행하십시오.

7

계산을 실행하는 경우가 종종이 아니므로 Oleksi는 말합니다. PHP의 exec() 명령을 사용하여 작업을 수행 할 외부 C++ 응용 프로그램을 실행하십시오.

그러나, 당신은 두 번째 당 몇 번 같이 계산 집중적으로를 실행 있다면, 처벌이 발생할 수있는 C++ 응용 프로그램의 초기 실행 시간;
그러면 PHP와 C++ 사이에서 데이터를주고받는 소켓 또는 파일 파이프를 수신하는 C++ 서비스/응용 프로그램을 볼 수 있습니다. 이렇게하면 EXE의 시작 시간이 저장됩니다.

3

다른 대안을 제시하려면 병렬로 실행할 수있는 여러 계산을 동시에 수행해야하는 경우 실제로 큰 도움이 될 수도있는 것은 Gearman입니다.

Gearman이 C++과 대화를 처리하고 동시에 여러 계산을 실행할 수 있습니다. Gearman은 단순히 작업 서버로 대화 할 수있는 구성 요소 일뿐 아니라 실제 작업을 실행하기 위해 작업 서버에 연결하는 작업자를 작성합니다. 이것은 또한 당신이 계산할 큰 것을 가지고 있다고 말하면서, 당신은 20 AWS EC2 인스턴스를 가동시킬 수 있고 그곳에있는 무거운 물건들에 대해 작업자를 수행 할 수 있습니다.

직선 및 병렬 실행이 필요하지 않은 경우 최고의 성능을 위해 Crashworks 접근 방식을 100 %로 사용하거나 두 가지를 혼합 할 수 있습니다.

0

php function system()이 작업을 수행합니다. 컴파일 된 C++ 파일을 system()에 전달하고 반환 된 결과를 얻습니다.

0

* ux 시스템의 경우 apache에서 CGI 스크립트로 C++ 응용 프로그램을 시작할 수 있습니다.

Apache: C/C++ script (이 참조에서 볼 수 있듯이 Windows에서도 사용할 수 있습니다.)

이 경우 CGTL 스크립트에 게시 할 HMTL 양식을 설정하기 만하면됩니다.

Linux와 Apache 2에서 테스트를 마쳤습니다. HTTP를 사용하여 매우 쉽게 조정할 수 있습니다.

1

는 예 그것을 수행 할 수 있습니다

PHP는 서버에서 명령을 실행할 수 있습니다.

system Function

: 창문이 링크 Linux의

exec Function

link for background processes in windows

을 확인 들어

과정은 Windows 및 Linux 시스템

을 모두 다르다

Running a process in background

글쎄, 나는이 과정을 사용하여 조금 성공했다.

그리고 한 가지 더 당신은 당신이 비동기 적으로 이들을 처리하는 경우도

0

, 당신에 의해 선택되는 데이터의 덩어리를 저장하는 작업 대기열 역할을 Beanstalkd 봐, 걸릴 수 있습니다 결과를 잡아 수 있습니다 처리를위한 또 다른 프로세스. 따라서 C++ 프로세스를 작성하여 무언가를 기다리고 Beanstalkd에서 작업을 시작할 수 있습니다. Beanstalkd는 빠르지 만 배포 될 수도 있습니다.

Beanstalkd 용 https://github.com/kr/beanstalkd/wiki/client-libraries 용 C 라이브러리 (++)가 몇 개 있습니다.

0

내가 아는 바로는 최고의 솔루션은 C++에서 PHP 확장을 작성하는 것입니다.

이렇게하면 my_func()라는 이름의 고유 '기본'PHP 함수를 만들 수 있습니다. 그리고 C++ 응용 프로그램의 속도와 함께 필요한 모든 계산을 수행하고 결과를 my_func()에서 반환합니다.

이 문제를보고 할 수 있습니다 : How to start writing a PHP5 extension in C++

관련 문제