php - How to continuously watch a directory for the presence of files with a certain file-extension? -
for example, want continuously monitor directory presence of .xml
files.
as .xml
file found in directory, program should start processing on file, e.g. reading data inside file, extracting useful data , further actions.
solution tried use:
i tried use infinite while loop continuously monitor directory, , used glob()
check presence of files .xml
extension. glob()
returns array paths of files found.
so within infinite while loop, check if array returned glob()
non-empty. if yes, read file @ each path in array returned glob()
, appropriate processing on file.
the problem when run it,
fatal error: maximum execution time of 30 seconds exceeded in c:\xampp\htdocs\alpha\index.php on line 9
i believe due infinite while loop.
questions:
is way of solving problem way?
what should bypass above error?
as example of using sse achieve stated intention of monitoring directory
the php script directory scans - in example simple glob
more sophisticated using recursiveiterator
etc
<?php /* sse.php */ set_time_limit( 0 ); ini_set('auto_detect_line_endings', 1); ini_set('max_execution_time', '0'); ob_end_clean(); /* -- set headers -- */ header('content-type: text/event-stream'); /* !important! */ header('cache-control: no-cache'); header('access-control-allow-credentials: true'); header('access-control-allow-methods: get'); header('access-control-expose-headers: x-events'); /* -- utility function send formatted sse message -- */ if( !function_exists('sse_message') ){ function sse_message( $evtname='dirmon', $data=null, $retry=1000 ){ if( !is_null( $data ) ){ echo "event:".$evtname."\r\n"; echo "retry:".$retry."\r\n"; echo "data:" . json_encode( $data, json_force_object|json_hex_quot|json_hex_tag|json_hex_amp|json_hex_apos ); echo "\r\n\r\n"; } } } /* how messages pushed client app */ $sleep = 5; /* directory monitor */ $dir = 'c:/temp/'; /* name of event monitor in js client app */ $evt = 'dirmon'; while( true ){ if( connection_status() != connection_normal or connection_aborted() ) { break; } /* methods here scan directory , produce data send */ $files=glob( $dir . '*.xml' ); $count = count( $files ); $payload=array( 'dir' => $dir, 'files' => $count ); /* -- prepare , send sse message -- */ sse_message( $evt, $payload ); /* -- send output -- */ if( @ob_get_level() > 0 ) for( $i=0; $i < @ob_get_level(); $i++ ) @ob_flush(); @flush(); /* wait */ sleep( $sleep ); } if( @ob_get_level() > 0 ) { for( $i=0; $i < @ob_get_level(); $i++ ) @ob_flush(); @ob_end_clean(); } ?>
the client page
<!doctype html> <html> <head> <title>sse</title> <script type='text/javascript'> var count=0; function bindevtsource(){ var evt='dirmon'; var url='/sse.php'; if ( !!window.eventsource ) { var evtsource = new eventsource( url ); evtsource.addeventlistener( 'open', function(e){ console.log(e.type); },false); evtsource.addeventlistener( 'error', function(e){ console.error('%o %s',e,e.type); },false); evtsource.addeventlistener( evt, function(e){ var json=json.parse(e.data); var files=json.files; if( files!=count ) { count=files; alert('contents changed - process changes! send ajax request? etc etc'); } document.getelementbyid('dirdata').innerhtml=e.data; },false); } else { alert('server sent events not supported in browser'); } } document.addeventlistener( 'domcontentloaded', bindevtsource, false ); </script> </head> <body> <div id='dirdata'></div> </body> </html>
you use response perform further actions initiating function within js - ie: send ajax request script whatever processing require ( server sent events uni-directional , can send / receive - receive! )
Comments
Post a Comment