2017-03-03 16 views
6

के साथ स्वचालित कॉल के रूप में नहीं, मेरे पास एक PHP स्क्रिप्ट है जो curl का उपयोग करके शेयरपॉइंट पर एक दस्तावेज़ अपलोड करती है। यदि मैं टर्मिनल में विज्ञान चलाता हूं, तो अपलोड प्रक्रिया ठीक काम करती है।फ़ाइल अपलोड करने के लिए PHP स्क्रिप्ट टर्मिनल में काम करता है, लेकिन इन्क्रोन

जब भी यह फ़ाइल बदल जाती है, तो मैं स्वचालित रूप से स्क्रिप्ट को कॉल करना चाहता हूं, मैं संबंधित फ़ोल्डर में परिवर्तन का पता लगाने और PHP स्क्रिप्ट के कॉल को ट्रिगर करने के लिए incron का उपयोग करता हूं।

मेरे incron फ़ाइल ऐसा दिखाई देता है:

/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php 

जब मैं syslog पर एक नजर है, मैं देख सकता है कि स्क्रिप्ट कॉल incron द्वारा सही ढंग से शुरू हो रहा किया गया है। लेकिन कुछ कारणों से, फ़ाइल शेयरपॉइंट पर अपलोड नहीं की गई है। मैंने वैश्विक लेखन अनुमतियों के साथ फ़ाइल बनाने का भी प्रयास किया, लेकिन इससे मेरी समस्या हल नहीं हुई।

-rwxrwxrwx 1 www-data www-data 49058 Mär 3 10:28 [file].xlsx 

यहाँ है मेरी स्क्रिप्ट मैं फोन कर रहा हूँ:

'database.php' शामिल हैं;

$username="[username]"; 
    $password="[password]"; 

    $localFileURL="/var/www/[further path]/temp/"; 
    $files = scandir($localFileURL, 1); 
    $newest_file = $files[0]; 
    $pathToUpload=getTeamPath($newest_file); 


    uploadDocument($pathToUpload . '/' . $newest_file, $localFileURL . $newest_file,$username, $password); 

    function uploadDocument($dest, $localFile,$username, $password){ 
      $fp = fopen($localFile, 'r'); 

    // Connecting to website. 
      $ch = curl_init(); 

      curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password); 
      curl_setopt($ch, CURLOPT_URL, $dest); 
      curl_setopt($ch, CURLOPT_UPLOAD, 1); 
      curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout 
      curl_setopt($ch, CURLOPT_INFILE, $fp); 
      curl_setopt($ch, CURLOPT_NOPROGRESS, false); 
      curl_setopt($ch, CURLOPT_BUFFERSIZE, 128); 
      curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile)); 
      curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM); 
      curl_exec ($ch); 

      if (curl_errno($ch)) { 

        $msg = curl_error($ch); 
      } 
      else { 
        $msg = 'File uploaded successfully.'; 
      } 
      curl_close ($ch); 
    } 

मैं वास्तव में किसी भी मदद की सराहना करता हूं !!!

संपादित करें: मैंने इसे सामान्य क्रोंटैब के साथ भी परीक्षण किया है और यह या तो काम नहीं करता है। यह त्रुटि को प्रिंट किए बिना स्क्रिप्ट और लूप निष्पादित करता है, लेकिन फ़ाइल अपलोड नहीं करता है। क्या यह संभव है कि प्रमाणीकरण के साथ कुछ करना है?

+0

जब मुझे क्रॉन स्क्रिप्ट नहीं चल रहा है, तो पहला संदिग्ध हमेशा फ़ाइल अनुमतियां होती है, लेकिन आप इस मुद्दे के बारे में पूरी तरह से अवगत हैं। दूसरा संदिग्ध खोल पर्यावरण चर हो सकता है। मैं कहीं भी पढ़ने योग्य और इसकी सामग्री की जांच करने के लिए PHP के '$ _ENV' चर को डंप करने का प्रयास करूंगा। –

+0

यदि आपने पहले से यह कोशिश नहीं की है, तो क्रॉन कॉल में एक फ़ाइल में अपनी स्क्रिप्ट्स STDOUT और STDERR को रूट करने का प्रयास करें, और देखें कि यह आपको क्या बताता है! –

+0

आपकी टिप्पणियों के लिए धन्यवाद। "> /var/www/[folder]/Log.log 2> & 1" को जोड़ने में मेरे आदेश में कोई आउटपुट नहीं है या क्या मैं इसे गलत कर रहा हूं? – user2550641

उत्तर

0

अंत में

तो फिर तुम इस लाइन को बदल सकते हैं यह पता चला कि यह समस्या प्रॉक्सी सेटिंग्स के साथ है ।

जो भी कारण Apache वेबसर्वर के साथ-साथ incron/क्रॉन वातावरण चर कि मशीन में (http_proxy, https_proxy ...)

इसलिए निर्धारित किया गया है पहचान नहीं पा रहे, प्रॉक्सी स्थापित करने के लिए और प्रॉक्सीपोर्ट सीधे मेरे कर्ल कमांड में मेरे लिए समस्या हल हो गई। proxy और proxyport स्थापना के बारे में

curl_setopt($ch, CURLOPT_PROXY, '[ip.ip.ip...]'); 
curl_setopt($ch, CURLOPT_PROXYPORT, '[port]'); 

अधिक जानकारी दिए गए लिंक में पाया जा सकता।

आपके सक्रिय योगदान के लिए सभी को धन्यवाद, मुझे खुशी है कि मुझे अंत में मेरी समस्या का समाधान मिला!

0

आप कहना है कि सभी काम करता है जब आप कमांड लाइन से

> php /var/www/[further path]/uploadToSharepoint.php 

मैन्युअल रूप से चलाना लेकिन incron के माध्यम से नहीं तो सबसे शायद समस्या user जो चलाता incrone आदेश

विकल्प 1 के साथ है) करने की कोशिश उपयोगकर्ता को पहचानें जो incrone कमांड चलाता है और उसके बाद उस उपयोगकर्ता पर स्विच करता है और फिर से चलाता है php /var/www/[further path]/uploadToSharepoint.php

विकल्प 2) अपनी स्कैन निर्देशिका में 0777 पर chmod करने का प्रयास करें और incron

+0

दोनों ने कोशिश की, कुछ भी काम नहीं किया था :-(incron रूट के साथ-साथ कॉल में भी किया जाता है कंसोल; chmod 777 पर सेट किया गया है लेकिन यह काम नहीं करता है। आपके प्रस्ताव के लिए धन्यवाद – user2550641

0

अपने प्रश्नों और टिप्पणियों के अनुसार, यह किसी भी तरह से काम नहीं करता है।

अपने कोड के अनुसार, मैं समारोह के बारे में बहुत यकीन है कि आप

$pathToUpload=getTeamPath($newest_file); 

का इस्तेमाल किया है आशा है कि यह आप सही अपलोड पथ देता है नहीं कर रहा हूँ। दूसरा आप CURLAUTH_NTLM का उपयोग कर रहे हैं। मुझे याद है कि एक बार मुझे ऐसा ही काम करना पड़ा था जब मैंने CURLAUTH_BASIC & का उपयोग किया था। तो कृपया इसके साथ प्रयास करें।

भी CURLOPT_USERPWD इसमें डोमेन शामिल करने का प्रयास करें।

$data = file_get_contents($file); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

इसके अलावा डिफ़ॉल्ट कर्ल से अनुरोध प्राप्त करने की कोशिश करेंगे:

curl_setopt($ch, CURLOPT_USERPWD, 'domain\\username:password'); 

के रूप में इसके अतिरिक्त आप CURLOPT_POSTFIELDS जहां डाटा आपकी फ़ाइल सामग्री उदाहरण मिलता है की स्थापना कर सकते हैं। मुझे लगता है कि यह पोस्ट या पुट अनुरोध होना चाहिए। http://php.net/manual/en/function.scandir.php

यह दूसरा पैरामीटर (sorting_order) का वर्णन करता है: अतः रूप

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 
0

मैं सिर्फ scandir-समारोह के प्रलेखन पृष्ठ पढ़ने को निर्दिष्ट विधि के साथ प्रयास करें

डिफ़ॉल्ट रूप से, क्रमबद्ध क्रम आरोही क्रम में वर्णमाला है। यदि वैकल्पिक सॉर्टिंग_ऑर्डर SCANDIR_SORT_DESCENDING पर सेट है, तो सॉर्ट ऑर्डर अवरोही क्रम में वर्णानुक्रम है। यदि यह SCANDIR_SORT_NONE पर सेट है तो परिणाम निरस्त नहीं किया गया है।

रूप sorting_order यह प्रकार दिया निर्देशिका में फ़ाइलों के निर्माण या संशोधन समय के आधार पर नहीं है लेकिन फ़ाइलें (वर्णमाला क्रम अवरोही) के नाम पर सॉर्ट क्रम को आधार बनाता जब आप 1 निर्दिष्ट करें।

अपने कोड में इन दो पंक्तियों है:

$files = scandir($localFileURL, 1); 
$newest_file = $files[0]; 

दूसरी पंक्ति के चर नामकरण $files[0] पता चलता है नवीनतम फ़ाइल होना चाहिए, लेकिन यह शायद अक्सर ऐसा नहीं है।

यह आपके भ्रमित निर्देशिका में कई फाइलें या निर्देशिका होने पर भ्रमित हो जाएगा और इस तरह यह समझा सकता है कि पहला प्रयास क्यों काम करता है और दूसरा प्रयास नहीं करता है।

/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php "[email protected]/$#" 

या हो सकता है की वजह से सुरक्षा के प्रभाव इस फार्म का उपयोग:

/var/www/[further path]/temp IN_MODIFY,IN_CREATE /usr/bin/php /var/www/[further path]/uploadToSharepoint.php "$#" 

एक सुझाव यह अपने incron-फाइल को संपादित करने और अपने पीएचपी स्क्रिप्ट को [email protected] और $# पैरामीटर के रूप में उपयोग करते हैं, की तरह करने के लिए है

दूसरे फॉर्म का उपयोग केवल फ़ाइल नाम जिसे अभी संशोधित किया गया है या अभी बनाया गया है उसे आपके PHP-स्क्रिप्ट के पैरामीटर के रूप में दिया गया है।

$newest_file = $files[0]; 
इस के लिए

:

$newest_file = $argv[1]; 

ध्यान दें कि के लिए ही आप है इस विकल्प को सक्षम करने की जरूरत है काम करने के लिए: http://php.net/manual/en/ini.core.php#ini.register-argc-argv

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