2008-09-24 17 views
6

विशेष रूप से मेरे पास एक PHP कमांड-लाइन स्क्रिप्ट है जो किसी निश्चित बिंदु पर उपयोगकर्ता से इनपुट की आवश्यकता होती है। मैं एक बाहरी संपादक (जैसे vi) निष्पादित करने में सक्षम होना चाहता हूं, और स्क्रिप्ट को फिर से शुरू करने से पहले संपादक को निष्पादन समाप्त करने का इंतजार करना चाहता हूं।मैं किसी बाहरी संपादक को PHP स्क्रिप्ट से कैसे बचूं और बाद में वापस आऊंगा?

मेरा मूल विचार संपादन करने के लिए एक अस्थायी फ़ाइल का उपयोग करना था, और बाद में फ़ाइल की सामग्री को पुनर्प्राप्त करना था।

$filename = '/tmp/script_' . time() . '.tmp'; 

get_user_input ($filename); 

$input = file_get_contents ($filename); 
unlink ($filename); 

मुझे लगता है कि यह एक PHP कमांड लाइन स्क्रिप्ट से संभव नहीं है, लेकिन मैं आशा करती हूं वहाँ है कि एक ही प्राप्त करने के लिए नियोजित किया जा सकता शेल पटकथा लेखन चाल के कुछ प्रकार है कि: की तर्ज पर कुछ प्रभाव।

अन्य स्क्रिप्टिंग भाषाओं में इसे कैसे प्राप्त किया जा सकता है इसके सुझाव भी स्वागत से अधिक हैं।

उत्तर

9

आप टर्मिनल के लिए संपादक के उत्पादन अनुप्रेषित कर सकते हैं:

system("vim > `tty`"); 
+2

विश्वास नहीं कर सकता यह इतना आसान था। – Evert

+0

ओएमजी, इतना आसान है। धन्यवाद! – marcio

2

मैं सिर्फ यह कोशिश की है और यह विंडोज़ में ठीक काम करता है, तो आप शायद आप लिनक्स पर चाहते vi या जो कुछ भी अनुप्रयोग के साथ दोहराने कर सकते हैं।

कुंजी यह है कि exec() PHP प्रक्रिया को लटकाता है जबकि नोटपैड (इस मामले में) चल रहा है।

<?php 

exec('notepad c:\test'); 
echo file_get_contents('c:\test'); 

?> 

$ php -r test.php 

संपादित करें: के रूप में अपने प्रयास शो और bstark ने बताया, मेरे नोटपैड परीक्षण आग ऊपर एक नई विंडो तो सब ठीक है, लेकिन किसी भी संपादक कि कंसोल मोड में चलाता है विफल रहता है, क्योंकि यह करने के लिए संलग्न करने के लिए कोई टर्मिनल है।

कहा जा रहा है कि मैंने exec('nano test'); echo file_get_contents('test'); के साथ एक लिनक्स बॉक्स पर कोशिश की और यह वीआई के रूप में बुरी तरह विफल नहीं है, यह बस कुछ भी प्रदर्शित किए बिना चलता है। मैं कुछ सामान टाइप कर सकता हूं, फ़ाइल को बंद और सहेजने के लिए "ctrl-X, y" दबाएं, और फिर php स्क्रिप्ट जारी रखी और जो मैंने लिखा था उसे प्रदर्शित किया। वैसे भी .. मुझे उचित समाधान मिला, इसलिए नया जवाब आ रहा है।

0

मुझे नहीं पता कि टर्मिनल php से vi कनेक्ट करना संभव है या नहीं, लेकिन त्वरित और आसान समाधान का उपयोग नहीं करना है एक ही टर्मिनल पर एक स्क्रीन संपादक।

आप या तो एडी (जिसे शायद आप नहीं चाहते हैं) जैसे लाइन संपादक का उपयोग कर सकते हैं या एक नई विंडो खोल सकते हैं, जैसे सिस्टम ("xterm -e vi") (अपने टर्मिनल ऐप के नाम से xterm को प्रतिस्थापित करें) ।

जोड़ने के लिए संपादित: perl में, सिस्टम ("vi") बस काम करता है, क्योंकि पर्ल फैंसी पाइपलाइनिंग/बफरिंग php करता है।

0

तो यह एक फ़ाइल लिखने के अपने विचार हमें नेतृत्व पागल बातें की कोशिश करने लगता है वहाँ है, जबकि एक आसान समाधान :)

<?php 

$out = fopen('php://stdout', 'w+'); 
$in = fopen('php://stdin', 'r+'); 

fwrite($out, "foo?\n"); 
$var = fread($in, 1024); 
echo strtoupper($var); 

fread() कॉल php प्रक्रिया रखती हूँ जब तक यह कुछ प्राप्त करता है (1024 बाइट्स या लाइन मुझे लगता है कि) के अंत में, यह उत्पादन:

$ php test.php 
foo? 
bar <= my input 
BAR 
+0

निश्चित रूप से, आप यह कर सकते हैं, लेकिन यह ठीक नहीं है कि मैं क्या कर रहा था। मेरा मुद्दा यह था कि मैं वीआई या इसी तरह के बाहरी संपादक की लचीलापन चाहता था। –

+0

ठीक है तो मुझे खेद है कि मैंने सोचा था कि आप उस विचार के साथ उपयोगकर्ता इनपुट प्राप्त करने के लिए एक हैक के रूप में आए हैं, फिर भी मैं बस गया हूं। – Seldaek