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:
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
@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
Đâ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