2010-09-03 18 views
16

मुझे पता है कि आप PHP फ़ाइल बनाकर और require_once का उपयोग कर तकनीकी रूप से PHP एक्सटेंशन बना सकते हैं।PHP एक्सटेंशन कैसे बनाएं

लेकिन यदि आपने सी या सी ++ में कोई एक्सटेंशन लिखा है तो यह प्रदर्शन को अनुकूलित करेगा।

यदि हां, तो आप इसके लिए "हैलो-वर्ल्ड" कैसे बनायेंगे?

उत्तर

6

आप इसे निष्पादित करके और ब्राउज़र में आउटपुट पास करके अपनी PHP साइट में स्टैंड-अलोन सी/सी ++ प्रोग्राम शामिल कर सकते हैं। जहां तक ​​वास्तव में इंटर-ऑपरेटिंग है, साइट-विशिष्ट कार्यक्षमता वाली लाइब्रेरी लिखने के लिए आपके समय के लायक नहीं है। यह अन्य मौजूदा पुस्तकालयों (MySQL, imagemagick, आदि) के साथ इंटरफ़ेस को छोड़कर बस नहीं किया जाता है।

वेब के लिए प्रोग्रामिंग अनुप्रयोग विकास की तरह नहीं है। उन्हें "तेज़" भाषाओं में लिखकर अपने कोड की बिट्स को अनुकूलित करना (असेंबली में आपके सी ++ प्रोग्राम के छोटे, तंग लूपिंग बिट्स लिखने के समान) विकास के समय के लायक नहीं है। आप अपने एप्लिकेशन को आसानी से बनाए रखने योग्य रखने से बेहतर हैं, यही कारण है कि स्क्रिप्टिंग भाषाएं वेब पर हावी होती हैं।

+1

में (dll) file कर सकते हैं, लेकिन उन उदाहरणों के बारे में क्या है जो सी ++ दिखाते हैं एक्सटेंशन अकेले PHP से दस गुना तेज है? – johnny

+0

@ जॉनीनी यह लगभग हर मामले में अप्रासंगिक है। यदि आप प्रदर्शन के बारे में चिंतित हैं, तो * पूरी साइट * सी ++ में लिखें और PHP को पूरी तरह से छोड़ दें। जब तक आप उस प्रदर्शन लाभ के लिए ठोस आवश्यकता का प्रदर्शन नहीं करते हैं, तब तक आपकी कोई भी कार्यक्षमता सी ++ पर पोर्टिंग करने में ** कोई ** मान नहीं है, और जब तक कि आप फेसबुक स्केल पर न हों, आपको इसकी आवश्यकता नहीं है। – meagar

+3

यह एक बुरा जवाब है। फेसबुक ने अपनी स्थापना के बाद से सी कोड पुस्तकालयों और PHP के लिए विस्तार लिखा है। फेसबुक के पैमाने पर स्केल करने का कोई तरीका नहीं होगा अगर यह व्यवसाय तर्क को पूरा करने के लिए सी/सी ++ जैसी तेजी से चल रही संकलित भाषा के लिए नहीं था। – cj5

5

Here PHP एक्सटेंशन पर एक ट्यूटोरियल है। चाहे वह प्रदर्शन को अनुकूलित करे या नहीं, यह आपके एक्सटेंशन पर लपेटने की कोशिश कर रहा है। लेकिन मैं ऑप्टिमाइज़ेशन उद्देश्यों के लिए एक PHP एक्सटेंशन केवल नहीं लिखूंगा। अगर मेरे पास कोई विकल्प नहीं है तो मैं एक लिखूंगा। अर्थात। इसे सीधे PHP में उपलब्ध कराने के लिए एक सामान्य सी लाइब्रेरी को लपेटना ...

+0

लिंक टूटा हुआ है। – Araw

18

सी/सी ++ में लिखे गए सॉफ़्टवेयर निश्चित रूप से PHP में कोड से तेज़ी से चलते हैं। और आप सी/सी ++ में एक एक्सटेंशन लिख सकते हैं और इसे PHP में लिंक कर सकते हैं। PHP मैनुअल यहां इसे शामिल करता है: http://php.net/manual/en/internals2.php

अन्य उत्तर PHP एक्सटेंशन लिखने के लिए अन्य ट्यूटोरियल के लिंक देते हैं, और आप अधिक जानने के लिए "PHP एक्सटेंशन ट्यूटोरियल" के लिए Google पर जा सकते हैं।

लेकिन क्या आपके ऐप में करना सही बात है एक और कहानी है। ज्यादातर विशेषज्ञ इस बात से सहमत हैं कि PHP 98% अनुप्रयोगों के लिए पर्याप्त तेज़, तेज़ चलता है। ऐसे उदाहरण जहां PHP पर्याप्त तेज़ नहीं है, भाषा के कारण सामान्य रूप से नहीं हैं, लेकिन प्रोग्रामर द्वारा निर्मित एक अक्षम अनुप्रयोग आर्किटेक्चर। यह एक कमजोरी है जिसे सी/सी ++ में आपके ऐप के कुछ हिस्सों को फिर से लिखकर उपचार नहीं किया जा सकता है।

11

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

इस कार्यक्षमता के आधार include बयान है, जो भी शामिल है और निर्दिष्ट फ़ाइल का मूल्यांकन करता है। एक्सटेंशन सही शब्द नहीं है, क्योंकि आप बस एक और PHP स्क्रिप्ट फ़ाइल शामिल कर रहे हैं। एक PHP एक्सटेंशन संकलित मॉड्यूल के रूप में भाषा के लिए अतिरिक्त कार्य प्रदान करता है।

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

हां, यह प्रदर्शन को अनुकूलित करता है। यही कारण है कि CPhalcon या YAF जैसे PHP एक्सटेंशन लिखे गए थे।

How to make a "Hello World" PHP Extension?

मैं वर्णन करूंगा कि आप पांच चरणों में "हैलो वर्ल्ड" PHP एक्सटेंशन कैसे बना सकते हैं।

एक डेबियन आधारित ओएस आवश्यक है, क्योंकि हमें कुछ टूल और निर्भरताओं को उपयुक्त प्राप्त करने की आवश्यकता है।

चरण 1 - सेटअप पर्यावरण/आवश्यकताओं के

एक PHP एक्सटेंशन सी कोड संकलित किया गया है बनाएँ।हमें एक खोल (पहले से स्थापित किया जाना चाहिए), एक संपादक (आपकी पसंद), एक कंपाइलर (यहां हम जीसीसी का उपयोग करेंगे), PHP स्वयं और निर्माण के लिए PHP विकास निर्भरता की आवश्यकता है।

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

चरण 2 - Config

हम अपने विस्तार का वर्णन करने की जरूरत है और एक बुनियादी विन्यास फाइल में यह गठन फ़ाइलें:

फ़ाइल: 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 

आप के रूप में देख सकते हैं, NEW_EXTENSION में एक सी फ़ाइल है: php_helloworld.c

चरण 3 - कोड

के हमारे विस्तार के लिए सी कोड बनाते हैं। दूसरी बात यह है

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); 

, हम स्रोत फ़ाइल बनाने:

सबसे पहले, हम एक हैडर फ़ाइल बनाने

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"); 
} 

चरण 4 - बिल्ड

अब, हम एक्सटेंशन बनाने के लिए तैयार हैं।

पहले हम एक PHP विस्तार के लिए निर्माण पर्यावरण को तैयार:

phpize 

फिर हम निर्माण कॉन्फ़िगर और हमारे एक्सटेंशन सक्षम:

./configure --enable-php-helloworld 

अंत में, हम यह निर्माण कर सकते हैं:

make 
sudo make install 

चरण 5 - टेस्ट

हमारे PHP एक्सटेंशन के परीक्षण के लिए देता है helloworld_php.so विस्तार फ़ाइल को लोड और हमारे समारोह helloworld_php() निष्पादित करें:

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

हो गया :) विंडोज पर


बिल्डिंग यदि आप विंडोज़ बनाने की कोशिश करते हैं (यिक्स!), तो आप चरणों थोड़ा समायोजित करने की आवश्यकता:

चरण 2 - Config

फ़ाइल: config.w32

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

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

चरण 4 -

उपयोग nmake बजाय का निर्माण make का।


उपयोगी साधन की सूची:

+1

मैं 'सी ++' एक्सटेंशन कैसे लिखूं? मैं पूरे वेब पर खोज कर रहा हूं और अप्रचलित ट्यूटोरियल के अलावा कुछ भी नहीं मिला। क्या आप संभवतः सी ++ उदाहरण शामिल करने के लिए अपना उत्तर बढ़ा सकते हैं या टूरियल या आधुनिक उदाहरणों के लिए कुछ अच्छे लिंक प्रदान कर सकते हैं? – razzak

+1

खैर, सी और सी ++ समान नहीं हैं। मैं PHP-CPP जैसे रैपर लाइब्रेरी का उपयोग करने का सुझाव दूंगा, बुनियादी शुरुआत के लिए http://www.php-cpp.com/documentation/your-first-extension देखें। आपको यहां इस लिब के लिए एक ट्यूटोरियल मिल सकता है: http://www.sitepoint.com/developing-php-extensions-c-php-cpp-advanced/ –

+0

'make' throws' php_helloworld.c: 28: 17: त्रुटि : 'helloworld_php_module_entry' अघोषित (पहली बार इस समारोह में उपयोग) '' –

0

मुझे लगता है कि (लेकिन कोई यकीन है कि) आप कर सकते हैं कि जो php के साथ मौजूद हैं द्वारा एक dll फ़ाइल बनाने के लिए और ext फ़ोल्डर में रख बताते हैं स्थापना फाइलें। अगर मेरे पिछले शब्द सही हैं तो आप दृश्य स्टूडियो

संबंधित मुद्दे