2011-11-15 13 views
7

मैं एक बहुत ही साधारण परीक्षण स्क्रिप्ट है:पीडीओ कनेक्शन कमांड लाइन से काम करता है, लेकिन अपाचे के माध्यम से नहीं?

<?php 

$DSN = "mysql:host=db.example.edu;port=3306;dbname=search_data"; 

try { 

    $DB = new PDO($DSN, "username", "super-secret-password!"); 

} catch (PDOException $e) { 

    header('Content-Type: text/plain'); 
    print "Could not connect to database, rawr. :-("; 
    exit; 

} 


$SQL = "SELECT phrase FROM search ORDER BY RAND() LIMIT 10"; 

foreach($DB->query($SQL) as $row){ 

    print $row['phrase']."\n"; 

} 

?> 

जब मैं कमांड लाइन से इस स्क्रिप्ट को निष्पादित, यह पूरी तरह से काम करता है:

$ php test.php 
corporal punishment 
Stretches 
voluntary agencies and the resettlement of refugees 
music and learning 
Nike Tiger Woods Scandal 
Hermeneia 
PSYCHINFO 
anthony bourdain 
Black-White Couples and their Social Worlds 
colonization, hodge 

लेकिन जब मैं अपने वेब ब्राउज़र के माध्यम ठीक उसी लिपि का उपयोग , यह कहते हैं:

Could not connect to database, rawr. :-(

मैं त्रुटि पर var_dump की कोशिश की है, और संदेश है: "SQLSTATE [HY000] [2003] MySQL सर्वर के लिए 'पर कनेक्ट नहीं कर सकता db.example.edu '(13) "।

यह परेशान है। यह एक ही सर्वर पर सटीक वही स्क्रिप्ट है - जब मैं इसे कमांड लाइन से निष्पादित करता हूं तो यह क्यों काम करता है, लेकिन जब अपाचे इसे निष्पादित करता है तो विफल रहता है?

+0

क्या यह एक लिनक्स सर्वर है? क्या यह Red Hat या CentOS SELinux चल रहा है? यदि हां, तो आप SELinux बूलियन्स सक्षम करने के लिए आवश्यकता हो सकती है 'httpd_can_network_connect' और' httpd_can_network_connect_db' अपाचे एक दूरस्थ डेटाबेस की मेजबानी के लिए कनेक्शन स्थापित करने के लिए अनुमति देने के लिए। इस त्रुटि (13 = अनुमति नहीं दी) के बारे में अधिक जानकारी के –

+1

यहाँ है: http://www.filonov.com/blog/2009/08/07/sqlstatehy000-2003-cant-connect-to-mysql-server-on-xxx -xxx-xxx-xxx-13/ – thetaiko

+0

@Michael हाँ, यह एक RHEL 6.1 सर्वर, और उस पर एक चमकदार नया एक है। इसके अलावा, @thetaiko - वह काम किया! यह SELinux कनेक्शन को अवरुद्ध कर रहा था, और रूट सेट के रूप में 'setsebool -P httpd_can_network_connect = 1' चला रहा था। यदि आप इसे उत्तर के रूप में पोस्ट करना चाहते हैं, तो मैं खुशी से स्वीकार करूँगा और ऊपर उठाऊंगा। –

उत्तर

24

यदि यह एक Red Hat-derived वितरण (RHEL, CentOS, Fedora, ScientificLinux) SELinux (या SELinux का उपयोग कर कोई भी Red Hat व्युत्पन्न) चला रहा है, तो इस लेखन के समय डिफ़ॉल्ट नीति सेटिंग अपाचे को बनाने से रोकती है अन्य सर्वर या डेटाबेस के लिए बाहरी कनेक्शन। रूट के रूप में, आपको निम्नलिखित दो SELinux बूलियन सक्षम करना होगा। रीबूट में परिवर्तन को बनाए रखने के लिए -P विकल्प का उपयोग करें।

setsebool -P httpd_can_network_connect=1 
setsebool -P httpd_can_network_connect_db=1 

ध्यान दें कि httpd_can_network_connect आवश्यक नहीं हो सकता है। पहले इसे केवल httpd_can_network_connect_db पर चालू करने का प्रयास करें।

+2

धन्यवाद! मेरे मामले में 'httpd_can_network_connect' लाइन आवश्यक नहीं थी, बस' httpd_can_network_connect_db' पंक्ति। –

+0

आपने अपना दिन बचाया। धन्यवाद – PHPst

+0

◕‿◕ एक बहुत अगर आप इस upvoted नहीं किया है, कृपया के बजाय तो ... – bart2puck

0

मैं PHP एफ़टीपी ftp_connect के लिए एक ही समस्या थी और

setsebool -P httpd_can_network_connect=1 

यह भ्रामक है स्थापित करने के लिए था, क्योंकि fil_get_contents और PHP और अपाचे कि सेट करने से पहले ठीक से कर्ल काम की तरह अन्य बातों के।

-1

एक ही मुद्दे पर अलग कारण यहां
मेरे समाधान सिर्फ एक सरल apt-get install php-mysql की दूरी पर था

अपने phpinfo()
इस पोस्ट पर यह पाया में pdo_mysql के लिए जांच करना सुनिश्चित करें: PDOException “could not find driver”

मुझे आश्चर्य है कि सीएलआई ने ऐसी स्थितियों में क्यों काम किया है O_o शायद कुछ गलत तरीके से स्थापित किया गया है, या overriden मिला? अच्छा, अब, यह ठीक काम करता है!

+0

देखभाल समझाने के लिए सिर्फ downvoting? मुझे अभी भी पता नहीं है कि यह सीएलआई में क्यों काम करता है और अपाचे के माध्यम से नहीं। अगर मुझे कुछ स्पष्ट याद आया, तो कृपया हमें बताएं कि क्या है। मैंने अपना समाधान पोस्ट किया क्योंकि यह वास्तव में मेरी समस्या हल करता है *, और दूसरों की मदद कर सकता है। अगर मैंने कुछ पूरी तरह गलत किया है, तो कृपया हमें उजागर करें। – Balmipour

0

इसके अलावा ऊपर स्वीकार किए जाते हैं जवाब

setsebool -P httpd_can_network_connect=1 
setsebool -P httpd_can_network_connect_db=1 

का उपयोग कर मैं भी एक फ़ाइल की सुरक्षा संदर्भ कि httpd पहुँचने का प्रयास कर रहा था बदलना पड़ा।

एक php apache के माध्यम से चलाने स्क्रिप्ट कोई प्रमाण पत्र फ़ाइल कि httpd के सामान्य दस्तावेज़ जड़ के बाहर था का उपयोग करने की कोशिश कर रहा था। Httpd एक्सेस को अनुमति देने के लिए फ़ाइल अनुमतियों को बदलने के लिए उस फ़ाइल में httpd पहुंच की अनुमति देने के लिए पर्याप्त नहीं था।मैं भी सुरक्षा संदर्भ के लिए बदलना पड़ा, तो बदलने से पहले:

[admin]$ ls -Z ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem 
-rw-r--r--. admin apache unconfined_u:object_r:unlabeled_t:s0 ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem 

बदलें संदर्भ का उपयोग करते हुए:

sudo chcon -v --type=httpd_sys_content_t ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem``` 

पाने के लिए:

[admin]$ ls -Z ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem 
-rw-r--r--. admin apache unconfined_u:object_r:httpd_sys_content_t:s0 ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem 

अब सब अच्छा है। /var/log/audit/audit.log पर देखने के लिए एक अच्छा संसाधन है और त्रुटियों पर ध्यान देना है। मेरे मामले में एक संकल्प की दिशा को इंगित करने वाली त्रुटि थी:

type=AVC msg=audit(1509047616.042:4049): avc: denied { read } for pid=17096 comm="httpd" name="rds-ca-2015-root-us-east-1-BUNDLE.pem" dev="xvdb" ino=262146 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:unlabeled_t:s0 tclass=file