2009-07-09 7 views
15

मैं PHP, के साथ पूंछ कमांड जैसे आंदोलन करना चाहता हूं लेकिन फ़ाइल में कैसे संलग्न हो सकता है?PHP में फ़ाइल लिखने के लिए कैसे करें?

+2

http://code.google.com/p/php-tail/ – Peeter

+0

Packagist पर उपलब्ध: https://packagist.org/packages/icyapril/tail – mjsa

उत्तर

24

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

function follow($file) 
{ 
    $size = 0; 
    while (true) { 
     clearstatcache(); 
     $currentSize = filesize($file); 
     if ($size == $currentSize) { 
      usleep(100); 
      continue; 
     } 

     $fh = fopen($file, "r"); 
     fseek($fh, $size); 

     while ($d = fgets($fh)) { 
      echo $d; 
     } 

     fclose($fh); 
     $size = $currentSize; 
    } 
} 

follow("file.txt"); 
+0

हाय, आपका समाधान एक जलती हुई प्रतीत हो रहा है बहुत सी सीपीयू (+ -40% मेरी टेस्ट कॉन्फ़िगरेशन पर)। फ़ोल्डर्स देखने के एक और अधिक कुशल तरीके से कोई संकेतक हैं? – Coyote

+1

'नींद (100)' एक सेकंड के 100 मिलियन के लिए, या 0.0001 सेकंड के लिए सो रहा है। कम CPU उपयोग के लिए इसे 'नींद (10000) '(0.01s) तक बढ़ाएं जब तक आपको अत्यधिक कम विलंबता की आवश्यकता न हो। जब आप उस पर नज़र डालते हैं तो आप कुछ हद तक ताजा (2000000) 'या 'नींद (2)' (2 एस) सोते हैं। – ReactiveRaven

+0

मैंने इस कोड को आजमाया, लेकिन कोई सफलता नहीं ... ब्राउज़र लोड हो रहा है ... और कोई गूंज नहीं .. – ihtus

2
$handler = fopen('somefile.txt', 'r'); 

// move you at the end of file 
fseek($handler, filesize()); 
// move you at the begining of file 
fseek($handler, 0); 

और शायद आप stream_get_line

2

के बजाय मतदान फ़ाइल आकार आप नियमित रूप से जाँच फ़ाइल संशोधन समय:: filemtime

+3

के लिए एसएसई है, दोनों को सतह के नीचे एक स्टेट() कॉल की आवश्यकता है, इसलिए यह वास्तव में कोई फर्क नहीं पड़ता। –

5

चेकआउट php-tail on Google code

यहां एक त्वरित नमूना, कि किसी भी त्रुटि हैंडलिंग शामिल नहीं करता है। यह PHP और जावास्क्रिप्ट के साथ एक 2 फ़ाइल कार्यान्वयन है और यह मेरे परीक्षण में बहुत कम ओवरहेड है।

यह भी एक ग्रेप कीवर्ड (ffmpeg के लिए उपयोगी है जो फ्रेम दर आदि हर दूसरे बाहर थूक) के साथ छानने का समर्थन करता है।

11
$handle = popen("tail -f /var/log/your_file.log 2>&1", 'r'); 
while(!feof($handle)) { 
    $buffer = fgets($handle); 
    echo "$buffer\n"; 
    flush(); 
} 
pclose($handle); 
+0

यह दुर्घटना अपाचे सर्वर .. यह केवल मेरे लिए करो? – dctremblay

+0

सुराग के लिए अपने त्रुटि लॉग की जांच करें, लेकिन यह आपकी अपाचे प्रक्रिया को क्रैश नहीं करनी चाहिए। –

0

नीचे जो मैंने ऊपर से अनुकूलित किया है। इसे अजाक्स कॉल के साथ समय-समय पर कॉल करें और अपने 'धारक' (टेक्स्टरेरा) में शामिल हों ... उम्मीद है कि यह मदद करता है ... आप सभी को धन्यवाद जो स्टैक ओवरफ्लो और ऐसे अन्य मंचों में योगदान करते हैं!

/* Used by the programming module to output debug.txt */ 
session_start(); 
$_SESSION['tailSize'] = filesize("./debugLog.txt"); 
if($_SESSION['tailPrevSize'] == '' || $_SESSION['tailPrevSize'] > $_SESSION['tailSize']) 
{ 
     $_SESSION['tailPrevSize'] = $_SESSION['tailSize']; 
} 
$tailDiff = $_SESSION['tailSize'] - $_SESSION['tailPrevSize']; 
$_SESSION['tailPrevSize'] = $_SESSION['tailSize']; 

/* Include your own security checks (valid user, etc) if required here */ 

if(!$valid_user) { 
    echo "Invalid system mode for this page."; 
} 
$handle = popen("tail -c ".$tailDiff." ./debugLog.txt 2>&1", 'r'); 
while(!feof($handle)) { 
    $buffer = fgets($handle); 
    echo "$buffer"; 
    flush(); 
} 
pclose($handle); 
संबंधित मुद्दे