WinAPI и PHP
Так случилось, что в PHP существует три модуля расширения — два для PHP4 и один для PHP5, позволяющих обращаться к Windows API. Способы их вызова различны, плюс ко всему, положение усугубляется тем, что модули расширения имеют одинаковые имена, документация есть только по первому из них, тогда как в комплект PHP включается второй.
Ниже — результат моей потребности выяснить как же это всё работает. Прежде всего стоит заметить, что w32api не работает с mod_php, если старая версия вызывает ошибку при попытке повторного вызова в то же child, то новая вызывает ошибку сразу. В режиме CGI и с PHP5 я таких экспериментов не проводил.
Итак, ниже — реализация функции link (hard link) для Windows NT. Под CLI пример работает как с PHP5, так и с PHP4. Конечно, для того, чтобы пример заработал, нужна файловая система, поддерживающая hard links. Под моей NTFS5 (Windows XP) ссылки ставятся.
// Written by Evgeny Stepanischev (aka BOLK)
if (PHP_OS == 'WINNT') {
// Модуль расширения FFI для PHP5
if (extension_loaded('ffi') || intval(PHP_VERSION) >= 5 && @dl('php_ffi.dll')) {
function link($target, $link) {
$api = & new ffi("[lib='kernel32.dll'] int " . "CreateHardLinkA( char *link, char *target, long *attr);");
return (bool)$api->CreateHardLinkA($link, $target, NULL);
}
} else
// Модуль расширения w32API для PHP4
if (extension_loaded('w32api') || @dl('php_w32api.dll')) {
// Старая версия модуля
if (function_exists('w32api_register_function')) {
if (!function_exists('CreateHardLinkA')) {
@w32api_register_function('kernel32.dll', 'CreateHardLinkA', 'bool');
}
if (function_exists('CreateHardLinkA')) {
function link($target, $link) {
return CreateHardLinkA($link, $target, NULL);
}
}
} else {
// Новая (примерно с версии PHP 4.3.0)
function link($target, $link) {
$api = & new win32;
$api->registerfunction("bool CreateHardLinkA" . "(string &link, string &target) From kernel32.dll");
return $api->CreateHardLinkA($link, $target);
}
}
}
}