Self-overwriting Scripts
Posted: Tue Aug 29, 2006 11:57 pm
Weirdan | Please use
I have only been able to test this on Windows. On WinXP it works, each time you run the script it outputs a different message, because it has overwritten itself with a new script.
Does anyone know if this will also work on Linux/Unix? Or will the file be locked?
Weirdan | Please use
Code: Select all
,Code: Select all
and [syntax="..."] tags where appropriate when posting code. Your post has been edited to reflect how we'd like it posted. Please read: [url=http://forums.devnetwork.net/viewtopic.php?t=21171]Posting Code in the Forums[/url] to learn how to do it too.[/color]
Hi, I'm currently designing a system which has one central script (core.php) and several plugin scripts that it can load and execute. This is a command line tool, not a web-application (however there is a web-server that hosts the most up-to-date versions of the scripts to allow for auto-updating).
When a plugin is loaded, its md5 is calculated and compared with an md5 from the server. If the values dont match, a new version of the plugin is downloaded from the server and written over the old plugin.
My problem has arisen because now I need to do this same procedure for the core itself. So basically i run my script ("php.exe core.php"), and then the script has to open itself (fopen('core.php')) and overwrite itself with a newer version of the script!
Coming from a C++ background, these seems totally illogical, but its the task i have been given...
So, to test whether this is even possible, I wrote the following test program:
[b]self_update.php[/b]Code: Select all
<?php
define( 'MESSAGE_1', 'i like the rice' );
define( 'MESSAGE_2', 'the rice is nice' );
define( "MESSAGE", MESSAGE_2 );
echo MESSAGE."\n";
$self = "./self_update.php";
$contents = @file_get_contents( $self );
$string_1 = "define( \"MESSAGE\", MESSAGE_1 );";
$string_2 = "define( \"MESSAGE\", MESSAGE_2 );";
if( strpos( $contents, $string_1 ) !== false )
$contents = str_replace( $string_1, $string_2, $contents );
else
$contents = str_replace( $string_2, $string_1, $contents );
$fp = @fopen( $self, 'w' );
fwrite( $fp, $contents );
fclose( $fp );
?>Does anyone know if this will also work on Linux/Unix? Or will the file be locked?
Weirdan | Please use
Code: Select all
,Code: Select all
and [syntax="..."] tags where appropriate when posting code. Your post has been edited to reflect how we'd like it posted. Please read: [url=http://forums.devnetwork.net/viewtopic.php?t=21171]Posting Code in the Forums[/url] to learn how to do it too.[/color]