2010-09-03 37 views
16

Tôi biết bạn có thể mở rộng PHP bằng cách tạo một tệp PHP và sử dụng require_once.Cách tạo phần mở rộng PHP

Nhưng nó sẽ tối ưu hóa hiệu suất nếu bạn đã viết phần mở rộng trong C hoặc C++.

Nếu có, bạn sẽ tạo ra "thế giới hello" cho điều đó như thế nào?

Trả lời

6

Bạn có thể kết hợp chương trình C/C++ độc lập vào trang PHP của bạn bằng cách thực thi và chuyển đầu ra cho trình duyệt. Theo như thực sự liên hành, nó không có giá trị thời gian của bạn để viết một thư viện có chức năng trang web cụ thể. Điều này chỉ đơn giản là không được thực hiện ngoại trừ giao diện với các thư viện hiện có khác (MySQL, imagemagick, vv).

Lập trình cho web không giống như phát triển ứng dụng. Tối ưu hóa các bit của mã của bạn bằng cách viết chúng bằng các ngôn ngữ "nhanh hơn" (tương tự như viết các bit nhỏ, chặt chẽ của chương trình C++ trong assembly) không đáng để phát triển. Bạn nên lưu giữ ứng dụng của mình dễ dàng duy trì, đây là lý do tại sao ngôn ngữ kịch bản chiếm ưu thế trên web.

+1

Nhưng những gì về những ví dụ trên có hiển thị C++ phần mở rộng nhanh hơn mười lần so với php một mình? – johnny

+0

@johnny Điều đó không liên quan trong hầu như mọi trường hợp. Nếu bạn lo lắng về hiệu năng đó, hãy viết * toàn bộ trang web * trong C++ và bỏ qua PHP hoàn toàn. Có ** không có giá trị ** trong việc chuyển bất kỳ chức năng nào của bạn sang C++ cho đến khi bạn chứng minh nhu cầu cụ thể về hiệu năng đó, và trừ khi bạn đang ở quy mô Facebook, bạn không có nhu cầu. – meagar

+3

Đây là câu trả lời không tốt. Facebook đã viết thư viện mã C và mở rộng cho PHP kể từ khi thành lập. Sẽ không có cách nào để Facebook mở rộng quy mô nếu nó không phải là ngôn ngữ biên dịch chạy nhanh hơn như C/C++ để thực hiện logic nghiệp vụ. – cj5

5

Here là hướng dẫn về các tiện ích mở rộng PHP. Cho dù nó sẽ tối ưu hóa hiệu suất hay không, nó phụ thuộc vào những gì bạn đang cố gắng để bọc trên phần mở rộng của bạn. Nhưng tôi sẽ không viết một phần mở rộng PHP chỉ cho mục đích tối ưu hóa. Tôi sẽ viết một cái nếu tôi không có lựa chọn. I E. Gói một thư viện C chung để làm cho nó có sẵn trực tiếp trong PHP ...

+0

Liên kết bị hỏng. – Araw

18

Phần mềm được viết bằng C/C++ chắc chắn chạy nhanh hơn mã trong PHP. Và bạn có thể viết một phần mở rộng trong C/C++ và liên kết nó thành PHP. Hướng dẫn sử dụng PHP bao gồm điều này tại đây: http://php.net/manual/en/internals2.php

Các câu trả lời khác cung cấp liên kết đến các hướng dẫn khác để viết phần mở rộng PHP và bạn có thể google cho "Hướng dẫn mở rộng PHP" để tìm thêm.

Nhưng liệu điều này có đúng trong ứng dụng của bạn hay không là một câu chuyện khác. Hầu hết các chuyên gia đồng ý rằng PHP chạy tốt, đủ nhanh cho 98% các ứng dụng. Các trường hợp mà PHP không đủ nhanh không phải là nói chung do ngôn ngữ, mà là một kiến ​​trúc ứng dụng không hiệu quả mà lập trình viên đã tạo ra. Đó là một điểm yếu mà không thể khắc phục bằng cách viết lại các phần của ứng dụng của bạn trong C/C++.

11

I know you can technically make PHP extension just by making a PHP file and using require_once .

Cơ sở của chức năng này là tuyên bố include, bao gồm và đánh giá tệp được chỉ định. Phần mở rộng không phải là thuật ngữ đúng, bởi vì bạn chỉ bao gồm một tập lệnh PHP khác. Một phần mở rộng PHP cung cấp các chức năng bổ sung cho ngôn ngữ dưới dạng một mô-đun được biên dịch.

But would it optimize the performance, if you wrote an extension in C or C++.

Có, nó tối ưu hóa hiệu suất. Đó là lý do tại sao các phần mở rộng PHP như CPhalcon hoặc YAF được viết.

How to make a "Hello World" PHP Extension?

Tôi sẽ mô tả cách bạn có thể tạo tiện ích mở rộng PHP "Hello World" trong năm bước.

Hệ điều hành dựa trên Debian là bắt buộc, vì chúng tôi cần tìm nạp một số công cụ và phụ thuộc với apt-get.

Bước 1 - Cài đặt Xây dựng Môi trường/Yêu cầu

Một phần mở rộng PHP được biên dịch mã C.Chúng ta cần một trình bao (nên đã được cài đặt), một trình soạn thảo (sự lựa chọn của bạn), một trình biên dịch (ở đây chúng ta sẽ sử dụng GCC), bản thân PHP và các phụ thuộc phát triển PHP cho việc xây dựng.

sudo apt-get install build-essential php7.0 php7.0-dev 

Bước 2 - Config

Chúng ta cần phải mô tả phần mở rộng của chúng tôi và các tập tin hình thành nó trong một tập tin cấu hình cơ bản:

File: config.m4

PHP_ARG_ENABLE(php_helloworld, Whether to enable the HelloWorldPHP extension, [ --enable-helloworld-php Enable HelloWorldPHP]) 

if test "$PHP_HELLOWORLD" != "no"; then 
    PHP_NEW_EXTENSION(php_helloworld, php_helloworld.c, $ext_shared) 
fi 

Như bạn có thể thấy, NEW_EXTENSION chứa tệp C: php_helloworld.c.

Bước 3 - Mã

Hãy tạo mã C cho phần mở rộng của chúng tôi.

Thứ nhất, chúng tôi tạo ra một tập tin tiêu đề:

php_helloworld.h

// we define Module constants 
#define PHP_HELLOWORLD_EXTNAME "php_helloworld" 
#define PHP_HELLOWORLD_VERSION "0.0.1" 

// then we declare the function to be exported 
PHP_FUNCTION(helloworld_php); 

Thứ hai, chúng ta tạo ra các tập tin nguồn:

php_helloworld.c

// include the PHP API itself 
#include <php.h> 
// then include the header of your extension 
#include "php_helloworld.h" 

// register our function to the PHP API 
// so that PHP knows, which functions are in this module 
zend_function_entry helloworld_php_functions[] = { 
    PHP_FE(helloworld_php, NULL) 
    {NULL, NULL, NULL} 
}; 

// some pieces of information about our module 
zend_module_entry helloworld_php_module_entry = { 
    STANDARD_MODULE_HEADER, 
    PHP_HELLOWORLD_EXTNAME, 
    helloworld_php_functions, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    NULL, 
    PHP_HELLOWORLD_VERSION, 
    STANDARD_MODULE_PROPERTIES 
}; 

// use a macro to output additional C code, to make ext dynamically loadable 
ZEND_GET_MODULE(helloworld_php) 

// Finally, we implement our "Hello World" function 
// this function will be made available to PHP 
// and prints to PHP stdout using printf 
PHP_FUNCTION(helloworld_php) { 
    php_printf("Hello World! (from our extension)\n"); 
} 

Bước 4 - Xây dựng

Bây giờ, chúng tôi sẵn sàng xây dựng tiện ích.

Đầu tiên chúng ta chuẩn bị môi trường xây dựng cho một phần mở rộng PHP:

phpize 

Sau đó chúng ta cấu hình xây dựng và cho phép mở rộng của chúng tôi:

./configure --enable-php-helloworld 

Cuối cùng, chúng ta có thể xây dựng nó:

make 
sudo make install 

Bước 5 - Thử nghiệm

Để kiểm tra mở rộng PHP của chúng tôi, cho phép tải các tập tin mở rộng helloworld_php.so và thực hiện chức năng của chúng tôi helloworld_php():

php -d extension=php_helloworld.so -r 'helloworld_php();'

Done :)


xây dựng trên Windows

Nếu bạn cố gắng xây dựng một Windows (YIKES!), sau đó bạn cần phải điều chỉnh các bước một chút:

Bước 2 - Config

File: config.w32

ARG_ENABLE("helloworld", "helloworld support", "yes"); 

if (PHP_HELLOWORLD == "yes") { 
    EXTENSION("helloworld", "php_helloworld.c"); 
} 

Bước 4 - Xây dựng

Sử dụng nmake thay của make.


Danh sách tài nguyên hữu ích:

+1

Làm cách nào để viết phần mở rộng 'C++'? Tôi đã tìm kiếm trên tất cả các trang web và không thể tìm thấy bất cứ điều gì nhưng hướng dẫn lỗi thời. Có thể bạn có thể mở rộng câu trả lời của bạn để bao gồm một ví dụ C++ hoặc cung cấp một số liên kết tốt để turorials hoặc ví dụ hiện đại? – razzak

+1

Vâng, C và C++ không giống nhau. Tôi sẽ đề nghị sử dụng một thư viện bao bọc như PHP-CPP, xem http://www.php-cpp.com/documentation/your-first-extension để bắt đầu cơ bản. Bạn có thể tìm thấy một hướng dẫn cho lib này ở đây: http://www.sitepoint.com/developing-php-extensions-c-php-cpp-advanced/ –

+0

'make' ném' php_helloworld.c: 28: 17: error : 'helloworld_php_module_entry' undeclared (sử dụng đầu tiên trong hàm này) ' –

0

tôi nghĩ rằng (nhưng không chắc chắn) bạn có thể làm điều đó bằng cách tạo một file dll và đặt nó trong thư mục ext mà tồn tại với php tập tin cài đặt.if các từ trước của tôi là chính xác bạn có thể làm điều đó (dll) file trong studio trực quan

Các vấn đề liên quan