Skip to content

Instantly share code, notes, and snippets.

@chobie
Created January 28, 2011 10:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chobie/800070 to your computer and use it in GitHub Desktop.
Save chobie/800070 to your computer and use it in GitHub Desktop.
inotify & rsync
<?php
/**
svn co http://svn.php.net/repository/inotify/trunk php-inotify
cd php-inotify
phpize && ./configure && make
sudo make install
# add "extension = inotify.so" to your php config.
# and modify this script.
php monitor.php
*/
$fd = inotify_init();
$directory = "/path/to/yourdirectory";
$fileSPLObjects = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory),
RecursiveIteratorIterator::CHILD_FIRST
);
foreach( $fileSPLObjects as $fullFileName => $fileSPLObject ) {
if($fileSPLObject->getFilename() !== ".git"){
inotify_add_watch($fd, $fullFileName, IN_ALL_EVENTS ^ IN_CLOSE_NOWRITE ^ IN_ISDIR ^ IN_OPEN);
}
}
while(true){
$flag = false;
$events = inotify_read($fd);
foreach($events as $key => $event){
$flags = array();
// for debug
if($event["mask"] & IN_ACCESS)
$flags[] = "IN_ACCESS";
if($event["mask"] & IN_MODIFY)
$flags[] = "IN_MODIFY";
if($event["mask"] & IN_ATTRIB)
$flags[] = "IN_ATTRIB";
if($event["mask"] & IN_CLOSE_WRITE)
$flags[] = "IN_CLOSE_WRITE";
if($event["mask"] & IN_CLOSE_NOWRITE)
$flags[] = "IN_CLOSE_NOWRITE";
if($event["mask"] & IN_OPEN)
$flags[] = "IN_OPEN";
if($event["mask"] & IN_MOVED_TO)
$flags[] = "IN_MOVED_TO";
if($event["mask"] & IN_MOVED_FROM)
$flags[] = "IN_MOVED_FROM";
if($event["mask"] & IN_CREATE)
$flags[] = "IN_CREATE";
if($event["mask"] & IN_DELETE)
$flags[] = "IN_DELETE";
if($event["mask"] & IN_DELETE_SELF)
$flags[] = "IN_DELETE_SELF";
if($event["mask"] & IN_MOVE_SELF)
$flags[] = "IN_MOVE_SELF";
if($event["mask"] & IN_CLOSE)
$flags[] = "IN_CLOSE";
if($event["mask"] & IN_MOVE)
$flags[] = "IN_MOVE";
if($event["mask"] & IN_UNMOUNT)
$flags[] = "IN_UNMOUNT";
if($event["mask"] & IN_Q_OVERFLOW)
$flags[] = "IN_Q_OVERFLOW";
if($event["mask"] & IN_IGNORED)
$flags[] = "IN_IGNORED";
if($event["mask"] & IN_ISDIR)
$flags[] = "IN_ISDIR";
if($event["mask"] & IN_ONLYDIR)
$flags[] = "IN_ONLYDIR";
if($event["mask"] & IN_DONT_FOLLOW)
$flags[] = "IN_DONT_FOLLOW";
if($event["mask"] & IN_MASK_ADD)
$flags[] = "IN_MASK_ADD";
if($event["mask"] & IN_ONESHOT)
$flags[] = "IN_ONESHOT";
//多分これくらいで足りるかと
if(($event["mask"] & IN_CLOSE_WRITE) && ($event["mask"] & IN_CLOSE)){
$flag = true;
} else if(($event["mask"] & IN_MODIFY)) {
$flag = true;
} else if($event["mask"] & IN_MOVED_TO || $event["mask"] & IN_MOVED_FROM) {
$flag = true;
} else if($event["mask"] & IN_CREATE) {
$flag = true;
} else if($event["mask"] & IN_DELETE) {
$flag = true;
} else if($event["mask"] & IN_MOVE_SELF) {
$flag = true;
}
}
if($flag){
//something changed. add sync script here.
$flag = false;
}
sleep(1);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment