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:

  1. is way of solving problem way?

  2. 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

Popular posts from this blog

php - How to display all orders for a single product showing the most recent first? Woocommerce -

asp.net - How to correctly use QUERY_STRING in ISAPI rewrite? -

angularjs - How restrict admin panel using in backend laravel and admin panel on angular? -