हिपहॉप के साथ स्टेटिक PHP कोड विश्लेषण

अचानक मुझे PHP के लिए स्थिर कोड विश्लेषण के रूप में हिपहॉप की ऐसी अद्भुत विशेषता के बारे में रूसी में जानकारी नहीं मिली, और इसलिए एक समीक्षा मिलती है, जिसके विचार से मुझे DevConf पर रासमस की प्रस्तुति द्वारा संकेत दिया गया था।

और यह सब कैसे है?

स्टेटिक कोड विश्लेषण एक बहुत ही उपयोगी चीज है, क्योंकि अन्यथा हम त्रुटि को तब तक नहीं देखेंगे जब तक कि फ़ंक्शन इसे नहीं कहा जाता है। हिपहॉप यह कैसे करता है? यह PHP को C ++ में ट्रांसलेट करता है!

इस प्रकार, हमें C ++ कोड का सांख्यिकीय रूप से विश्लेषण करने का अवसर मिलता है, जो सामान्य रूप से किसी को भी लंबे समय तक आश्चर्यचकित नहीं करता है, और फिर प्राप्त जानकारी को PHP (स्वाभाविक रूप से स्वचालित रूप से) पर लागू करता है।

तो चलिए शुरू करते हैं।

पर्यावरण

परीक्षणों के लिए, मैंने एक नया सेंटोस 5.8 x64 सर्वर उठाया
# uname -a Linux TEST 2.6.18-308.8.1.el5xen #1 SMP Tue May 29 15:38:25 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux 


इस पर स्थापित HipHop
 rpm -ivh http://epel.osuosl.org/5/x86_64/epel-release-5-4.noarch.rpm rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/ius-release-1.0-10.ius.el5.noarch.rpm rpm -ivh http://pkg.tag1consulting.com/hphp/x86_64/hphp-release-1.0-2.el5.noarch.rpm yum install hiphop-php -y 


एक पर्यावरण चर जोड़ा (किसी कारण के लिए, आरपीएम स्वयं नहीं था)
 export HPHP_HOME=/usr/lib64/hphp 


और रिपोर्ट के लिए एक फ़ोल्डर बनाया
 mkdir /var/reports export SRC_DIR=/var/www/ export OUTPUT_DIR=/var/reports 


अब पर्यावरण तैयार है और आप प्रयोग करना शुरू कर सकते हैं।

विश्लेषण की तैयारी


पहले आपको उन फ़ाइलों की सूची बनाने की आवश्यकता है जिनका हम विश्लेषण करेंगे।
मैंने एक परीक्षण फ़ाइल का विश्लेषण किया, लेकिन यदि आप एक बार में अपनी पूरी परियोजना की जाँच करना चाहते हैं, तो आप यह कर सकते हैं:
 find $SRC_DIR -name '*.php' > $OUTPUT_DIR/files.txt 


फ़ाइलों की सूची संकलित होने के बाद, आपको निम्न मापदंडों के साथ इसे HipHop को खिलाना होगा:
--target = विश्लेषण - हमने हिपहॉप को क्यों कहा?
--input-list = $ OUTPUT_DIR / files.txt - जाँच करने के लिए फ़ाइलों की सूची
--input-dir = $ SRC_DIR - वे फाइलें कहाँ हैं जिनकी जाँच की जानी चाहिए?
--output-dir = $ OUTPUT_DIR - परीक्षा परिणामों को कहाँ सहेजना है?
--जन-आँकड़े = 1 - सांख्यिकीय त्रुटि जानकारी के साथ एक फ़ाइल बनाएँ
--log = 3 - कंसोल में प्रदर्शित होने वाले लॉग का स्तर (3 - स्पष्ट रूप से)
--force = 1 - मिली त्रुटियों को अनदेखा करें और विश्लेषण जारी रखें
- अपरे-ऑन-डिमांड = 0 - उन फाइलों को न छुएं जो सूची में नहीं हैं

के विश्लेषण

चलो चलते हैं!
 $HPHP_HOME/src/hphp/hphp --input-list=$OUTPUT_DIR/files.txt --input-dir=$SRC_DIR --output-dir=$OUTPUT_DIR --gen-stats=1 --log=3 --force=1 --parse-on-demand=0 --target=analyze 


वैसे, अगर पार्स करने के दौरान आपको "Unable to parse file: /var/www/user.php\n (Line: 14, Char: 23): जैसी त्रुटियां मिलती हैं "Unable to parse file: /var/www/user.php\n (Line: 14, Char: 23):
इसका मतलब है कि फ़ाइल में एक सिंटैक्स त्रुटि है और यह बिल्कुल काम नहीं करता है, इसलिए इस पर ध्यान दें!

विश्लेषण परिणाम


जब hphp ने अपना काम पूरा कर लिया (और यह आश्चर्यजनक रूप से तेजी से होता है!), दो फाइलें / var / रिपोर्ट / फ़ोल्डर में दिखाई देती हैं:
CodeError.js और Stats.js

उत्तरार्द्ध की सामग्री को इस तरह से डिक्रिप्ट किया गया है:
 Array ( [FileCount] => 125 [LineCount] => 11784 [CharCount] => 433255 [FunctionCount] => 350 [ClassCount] => 17 [TotalTime] => 0 [AvgCharPerLine] => 36 [AvgLinePerFunc] => 33 [SymbolTypes] => Array ( [Array] => 64 [Boolean] => 43 [Double] => 30 [Int32] => 68 [Int64] => 2208 [Numeric] => 23 [Object] => 11 [Object - Specific] => 58 [Primitive] => 31 [Sequence] => 2 [String] => 221 [Variant] => 1458 [_all] => 4217 [_strong] => 2703 [_weak] => 1514 ) [VariableTableFunctions] => Array ( ) ) 

मेरी राय में, सब कुछ स्पष्ट है और समझाने के लिए कुछ भी नहीं है।

लेकिन CodeError.js को अधिक विस्तार से माना जाना चाहिए।
यह JSON फॉर्मेट में भी है और इसमें उन सभी त्रुटियों की जानकारी है जो हिपहॉप को मिली।
और वह निम्न प्रकार की खराबी की तलाश कर रहा है:



फ़ाइल में JSON एक सरणी है, जिसके पहले तत्व में पाई गई त्रुटियों की संख्या इंगित की गई है, और दूसरी में उनकी सूची वास्तव में समूहों द्वारा क्रमबद्ध है।

एक पठनीय प्रारूप में सभी त्रुटियों को देखने के लिए, आप पैट्रिक अलार्ट की एक स्क्रिप्ट का उपयोग कर सकते हैं या कुछ सुंदर लिख सकते हैं और उपहार के साथ =)

उदाहरण

इतनी भयानक फाइल है
 <?php ini_set('display_errors', 0); require("$a.php"); define('CONSTANT', 1); function myfunc($arg1 = 'optional', $arg2) { echo $missing_var; } define('CONSTANT', 1); 


उस पर एक परीक्षण चलाएँ, और फिर त्रुटियों को देखने का प्रयास करें
 ./CodeErrorFormatter.php /var/report/CodeError.js 


उफ़, मेरे PHP ने एक गेटअप त्रुटि दी, लेकिन मैंने सिर्फ पेन के साथ फ़ाइल पथ में प्रवेश किया और यह आउटपुट मिला:
CodeErrorFormatter 1.1.0 by Patrick Allaert.

UseUndeclaredVariable
================================================================================

/var/www/index.php
9:9 -> 9:21 details: $missing_var
4:9 -> 4:11 details: $a
DeclaredConstantTwice
================================================================================

/var/www/index.php
12:0 -> 12:21 details: define('CONSTANT', 1)
RequiredAfterOptionalParam
================================================================================

/var/www/index.php
8:16 -> 8:41 details: $arg2


जैसा कि आप देख सकते हैं, टाइप, फाइल एड्रेस, नॉन-मैचिंग फंक्शन / वैरिएबल का नाम, फाइल में इसकी लाइन और पोजीशन यहाँ प्रत्येक त्रुटि के लिए दी गई है। उनके साथ आगे क्या करना है - अपने लिए सोचें (या तो एक स्वचालित बग रिपोर्ट, या इसे स्वयं ठीक करें, या कुछ और)।

निष्कर्ष

सामान्य तौर पर, PHP के लिए स्थैतिक विश्लेषण का विषय नया नहीं है, हालांकि, इस विषय पर कुछ रूसी भाषा के लेख हैं और उनमें से कोई भी हिपहॉप को प्रभावित नहीं करता है।

मैं सभी से आग्रह करता हूं कि इसका उपयोग करने का प्रयास करें। बेशक, आपको यह नहीं सोचना चाहिए कि यह एक "चांदी की गोली" है, लेकिन विश्लेषण उन चीजों को दर्शाता है जो किसी व्यक्ति के लिए पकड़ना बहुत मुश्किल है।

मुझे उम्मीद है कि इस समीक्षा से किसी को लाभ होगा, या हो सकता है कि कोई अन्य व्यक्ति ब्राउज़र से कोड का खूबसूरती से परीक्षण करने के लिए एक दृश्य लिखेगा?

===================

फेसबुक हिपहॉप प्रोजेक्ट
CodeError.js CodeFormatter
DevConf 2012 में Rasmus Lerdorf की प्रस्तुति वार्ता .php.net / show / devconf/ - a-see!

Source: https://habr.com/ru/post/In145683/


All Articles