Бывают такие ситуации когда много лет делаешь что-то одним способом и вдруг понимаешь, что то, что ты много лет делал на самом деле может быть сделано гораздо проще. И ведь знал об этом, просто не догадывался сложить два плюс два чтобы сделать очевидные выводы.
Вот практическая задача - как из программы на PHP получить данные посланные методом POST. Казалось бы нет ничего проще - бери переменную $_POST и смотри что в ней. Но... Переменная $_POST полезна только в том случае если данные были посланы в виде пар имя+значение, т.е. например через HTML форму. Однако, в ряде практических задач приходится иметь дело не с HTML формами, например, если имеем дело с XML преданным непосредственно методом POST - тут стандартная переменная $_POST не подходит.
В PHP для того чтобы непосредственно получить POST данные есть переменная - $HTTP_RAW_POST_DATA - но, она определена только если в php.ini включена always_populate_raw_post_data а она по умолчанию выключена - конечно ее можно включить через .htaccess но только если php стоит как модуль Апача, а это как правило сделано не всегда.
Все мы знаем, что в CGI приложения POST данные передаются через стандартный поток ввода. Значит, если открыть стандартный поток ввода по его имени в PHP он называется input то можно прочитать его содержимое:
$r = file_get_contents("php://input"); //contents of POST buffer
Указанный метод, похоже, работает всегда - и для модуля Апача и для CGI и к настройкам php.ini он не чувствителен.
Встала такая задача - вывести в список всех флеш роликов используемых в проекте. При этом известен только FTP заход. Конечно, можно просмотреть все страницы сайта, посмотреть где есть ссылки на swf и записать их адреса, но это займет много времени да к тому же можно что либо пропустить. Можно воспользоваться возможностями FAR Мanager, но он не выводит результат в текстовый файл, поэтому написал вот такую программку:
<?php
error_reporting(E_ALL | E_STRICT);
class FtpSearch {
var $server_url = '';
var $username = '';
var $password = '';
var $remote_folder = '';
var $ftp;
function log($message){
print $message;
}
function show(){
$this->ftp = ftp_connect($this->server_url);
if ($this->ftp===FALSE){
$this->log('Can not connect to FTP server');
}
else {
$this->log('Connected successful');
if(ftp_login($this->ftp,$this->username,$this->password)){
$this->getListOfFiles($this->remote_folder,$this->remote_folder);
}
else {
$this->log('Login failure!');
}
ftp_quit($this->ftp);
$this->log('Connection closed!');
}
}
function getListOfFiles($folder,$filename){
flush ();
set_time_limit(30);
if (ereg('\.swf$',$folder)){
print $folder.'<br />';
}
$c = @ftp_chdir($this->ftp,$filename);
if ($c){
$list = ftp_rawlist($this->ftp,'');
$files = array();
reset($list);
while (list(,$row) = each($list)) {
$buf="";
if ($row[0]=='d'||$row[0]=='-'){
$buf = ltrim(substr($row,55));
$files[]=$buf;
}
}
if ($files!==FALSE){
foreach($files as $file){
if (($file!='..') and ($file!='.')){
$this->getListOfFiles($folder.'/'.$file,$file);
}
}
}
$c = ftp_chdir($this->ftp,'..');
}
}
}
$c = new FtpSearch();
$c->show();
?>
Сегодня случилось удалять сообщения из POP3 почтового аккаунта в коем набралось больше шести тысяч писем спама. Конечно гораздо проще убить и заново создать ящик, но это слишком просто, гораздо интереснее написать небольшую программку, которая и убьет все сообщения, тем более что здесь нашел замечательную функцию на PHP. Вот ее код:
function deleteAllMessages($server,$username,$password){
$cmd = array();
$cmd[] = "USER $username\r\n";
$cmd[] = "PASS $password\r\n";
$cmd[] = "STAT\r\n";
$cmd[] = "QUIT\r\n";
// Server is your POP3 server, ie pop3.server.com
// Port is the port number ( should be 110 )
$port = 110;
$fp = fsockopen($server, $port);
if(!$fp)
{
print("Error connecting to server $server");
}
else
{
$ret = fgets($fp, 1024);
foreach($cmd as $ret)
{
fputs($fp,$ret);
$line = fgets($fp, 1024);
if($ret=="STAT\r\n")
{
$fields = explode(" ",$line);
print 'found '.$fields[1].' massages
';
$num_mails = $fields[1];
for($i=1;$i<=$num_mails;$i++)
{
set_time_limit(30);
fputs($fp,"DELE $i\r\n");
$line = fgets($fp, 1024);
flush();
}
}
}
fclose($fp);
}
}
здесь выложил работающий пример.
svn --editor-cmd="vi" propedit svn:ignore .
function validateEmail(elementValue){
var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
return emailPattern.test(elementValue);
}