
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.90] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Если у Вас возникли какие-либо вопросы по данному FAQ'у, замечания можно оставить в следующей теме: Обсуждение FAQ-ов
Отправка e-mail сообщений в PHP. Здесь я попытаюсь кратко изложить основные возможности отправки электронной почты в PHP. 1. Функция mail(). Действия функции mail() зависят от операционной системы. В UNIX она попытается использовать процесс программы SendMail для отправки сообщения. В Windows она пытается использовать SMTP или же внутреннюю эмуляцию процесса SendMail. Прототип функции выглядит так: ![]() ![]() bool mail(string to, string subject, string message [, string additional_headers [, string additional_parameters]]); to содержит адрес получателя, subject - тему письма, message - содержимое (текст). В additional_headers можно поместить дополнительные HTTP заголовки, а additional_parameters - параметры вызова процесса sendmail. К примеру, мы хотим отправить письмо некоему john@doe.com, причем указать обратный адрес admin@microsoft.com и почтовую программу "E-mail Terminator v.1000": ![]() ![]() mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта", "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!"); Подведем итоги. Плюсы: простота и легкость в использовании. Минусы: невозможность отправки писем с других серверов (кроме localhost), отсутствие поддержки SMTP аутентификации (для некоторых серверов), невозможность присоединения файлов, возможные проблемы при использовании почтовых служб, отличных от SendMail, в UNIX. 2. Сокеты. Этот способ всех "ближе к телу". Здесь нам самим придется вникнуть в особенности протокола SMTP. Итак, нам придется соединиться с почтовым сервером, создав сокет, "пообщаться" c сервером, отправить заголовки и текст письма, после чего закрыть соединение. Для этого напишем свою простую функцию sock_mail(): ![]() ![]() function sock_mail($host, $to, $from, $subj, $message, $type) { if($type=="") $type="text/plain"; // Определям тип по умолчанию // Соединение $fp = fsockopen($host, 25); // Подключаемся на 25 порт сервера $host // Приветствие $log .= fgets($fp); // Читаем приветствие сервера fputs($fp, "HELO: $host"); // Привет, сервер :) $log .= fgets($fp); // Читаем ответ fputs($fp, "MAIL FROM:<$from>"); // Определяем пользователя $log .= fgets($fp); // Читаем ответ fputs($fp,"RCPT TO:<$to>"); // Определяем получателя $log .= fgets($fp); // Читаем ответ fputs($fp, "DATA"); // Приветствие окончено, теперь приступим к делу $log .= fgets($fp); // Читаем ответ // Заголовки fputs($fp, "X-Mailer: Sock_Mail v.1.0"); // Название клиента (необязательно) fputs($fp, "Reply-To: $from"); // Адрес, на который идут ответы (необязательно) fputs($fp, "From: $from"); // Отправитель fputs($fp, "Subject: $subj"); // Тема fputs($fp, "MIME-Version: 1.0"); // Версия MIME (необязательно) fputs($fp, "Content-Type: $type"); // Тип содержимого fputs($fp,""); // Пустая строка // Содержимое fputs($fp, $message); // Конец диалога fputs($fp, "."); $log .= fgets($fp); // Читаем ответ fputs($fp, "QUIT"); // Сообщаем о выходе $log .= fgets($fp); // Читаем ответ // Завершение соединения fclose($fp); // Закрываем сокет return $log; // Возвращаем ответы сервера. } В принципе, эта та же функция mail(), только работает с любым сервером через соединение на 25-й порт. Чуть позже мы рассмотрим улучшенный вариант использования сокетов. Исходник функции также можно найти в аттаче (файл sock_mail.php). Подведем итоги. Плюсы: соединение с любым почтовым сервером, неограниченные возможности по улучшению. Минусы: все приходится писать самостоятельно. Добавлено 16/08/2007 by Рысь: Небольшое добавление про перенос строк : Отправка почты (сообщение #1665050) 3. Библиотеки. Существует огромное количество библиотек для работы с почтой. Большинство из них является лишь объектно-ориентированной надстройкой над стандартной mail(). Я не буду их сдесь рассматривать, так как у меня есть идея получше (см. ниже). Подведем итоги. Плюсы: объектно-ориентированный интерфейс, возможность прикрепления файлов. Минусы: большинство таких библиотек наследуют недостатки функции mail(). 4. Эксклюзив. Специально для вас я модифицировал один из популярных классов Mail и интегрировал в него некоторые новые возможности так, чтобы он принимал во внимание особенности и недостатки всех описанных здесь методов. Исходник класса можно найти в аттаче (файл mail.php), а здесь мы рассмотрим работу с этим классом. 4.0 Создание объекта: ![]() ![]() $m = new Mail(); // Теперь $m - объект класса Mail 4.1 Метод Host(). Этот метод определяет имя сервера, который будет использован для отправки сообщения. По умолчанию будет использован localhost. Если вы хотите использовать другой сервер, нужно сделать это так: ![]() ![]() $m->Host("mail.myhost.com"); // Будем отправлять писмо с mail.myhost.com 4.2 Метод Username() и Password(). Устанавливают имя пользователя и пароль для SMTP аутентификации. ВНИМАНИЕ: используйте только если сервер требует аутентификации для SMTP! ![]() ![]() $m->Username("admin"); // Используем пользователя admin $m->Password("sWordFiSH"); // Пароль - sWordFiSH 4.3 Метод Content_type(). Устанавливает тип содержимого письма. ![]() ![]() $m->Content_type("text/html"); // Письмо в виде HTML 4.4 Метод autoCheck(). Проверять правильность адресов e-mail или нет? По умолчанию - false. ![]() ![]() $m->autoCheck(true); // Будем проверять адреса 4.5 Метод Subject(). Устанавливает тему сообщения. Пример: ![]() ![]() $m->Subject("How to make million dollars per day."); // Без комментариев 4.6 Метод From(). Устанавливает адрес отправителя. По умолчанию - nobody@localhost. ![]() ![]() $m->From("user@host.com"); // Отправляем с адреса user@host.com 4.7 Метод ReplyTo(). Адрес, на который будут приходить ответы. ![]() ![]() mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта", "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!"); 4.8 Метод To(). Добавляет нового адресата в список "To:". После вызова Send писмьмо будет отправлено по всем адресам из списка. Пример: ![]() ![]() mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта", "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!"); 4.9 Метод Cc(). То же, что и метод To(), но для поля "CC:". 4.10 Метод Bcc(). То же, что и To(), но для "BCC" ("Blank Carbon Copy"). 4.11 Метод Body(). Устанавливает текст сообщения, принимая его в качестве первого аргумента. В качестве второго аргумента можно (но необязательно) указать кодировку письма. ![]() ![]() mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта", "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!"); 4.12 Метод Organization(). Устанавливает вашу организацию. Пример: ![]() ![]() mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта", "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!"); 4.13 Метод Priority(). Устанавливает приоритет письма (1 - самый высокий, 2 - высокий, 3 - нормальный, 4 - низкий, 5 - самый низкий). ![]() ![]() mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта", "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!"); 4.14 Метод Attach(). Прикрепляет файл к письму (можно прикреплять несколько файлов). Первый аргумент - путь к файлу, второй (необязательно) - его MIME тип, третий (необязательно) - его dispostion (inline - клиенту можно его отобразить, attachment - обязательно сохранить на диске), по умолчанию inline. ![]() ![]() mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта", "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!"); 4.15 Метод Send(). Производит отправку письма: ![]() ![]() mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта", "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!"); 4.16 Метод Get(). Выводит письмо таким, каким его получит клиент. ![]() ![]() mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта", "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!"); Подведем итоги. Плюсы: универсальность и сочетание всех необходимых возможностей. Минусы: надеюсь, что их нет... Прикреплённый файл ![]() |
Сообщ.
#2
,
|
|
|
Функции в PHP
Несколько интересных моментов из жизни функций в PHP. 1. Передача аргументов по ссылке, глобальная область видимости, константы. Обычно все аргументы в PHP передаются по значению, то есть если мы предаем функции foo() аргумент $bar, то для использования в теле foo() будет создана локальная копия $bar. Все бы хорошо, но что будет если $bar содержит, скажем, дамп базы данных? Тогда производительность резко упадет, и скрипт будет занимать большой объем памяти. В таком случае следует использовать передачу аргумента по ссылке. Кроме того, если аргумент был передан по ссылке, то функция легко изменит его значение, не прибегая к средствам return. Итак, есть два способа передачи аргументов по ссылке: 1.1. Ссылка (&) в списке аргументов. Этот способ используется при написании кода функции. Если вы хотите, чтобы аргумент $bar передавался вашей функции foo по ссылке, можно сделать это так: ![]() ![]() function foo(&$bar) { echo $bar; $bar = ''; } Эта функция будет принимать строку по ссылке, выводить ее содержимое, а потом очищать (присваивать переменной $bar пустую строку). 1.2 Передача ссылки в качестве аргумента. Можно написать функцию, которая будет работать как со ссылками, так и с обычными аргументами: ![]() ![]() function foo($bar) { $bar .= "; Передана по ссылке"; // Если переменная передана по ссылке, мы можем изменять ее значение. } $str = "Строка"; foo($str); echo $str; // Выведет: Строка foo(&$str); echo $str; // Выведет: Строка; Передана по ссылке А если вы просто заботитесь о производительности, то можно передавать переменную по ссылке любой функции: ![]() ![]() $result = some_function(&$argument); 1.3 Глобальные переменные. В коде функции можно объявить о том, что данную переменную нужно взять из глобальной области видимости. Фактически, эффект тот же, что и от передачи по ссылке. Разница в том, что для этого не нужно ничего объявлять в списке аргументов. Пусть функция process_array() производит оработку массива $big_array: ![]() ![]() function process_array() { global $big_array; for($i = 0; $i < count($big_array); $i++) { // Какие-то действия над массивом } } // $big_array должен быть объявлен в глобальной области видимости $big_array = Array("test1", "test2", "test3"); process_array(); 1.4 Константы. Константы - отдельная статья. Они объявляются в глобальной области видимости и доступны отовсюду. В отличие от переменной, для доступа к константе не нужен знак доллара ($) и изменять значение уже объявленной константы запрещено. ![]() ![]() <? // Чтобы не путать с функциями, констанам обычно дают имена верхнего регистра. define("MAX_SIZE", 1024); define("MESSAGE", "HELLO"); function foo() { if(defined('MAX_LENGTH') && defined('MESSAGE')) // Определяем, заданы ли константы { for($i = 0; $i < MAX_LENGTH; $i++) echo MESSAGE; } } foo(); // Выведет HELLO 1024 раза ?> Что использовать в данном конкретном случае полностью зависит от вас. Лично я использую: Константы - в файлах конфигурации. config.php: ![]() ![]() <? define('DB_HOST', 'localhost'); define('DB_USER', 'db_user'); define('DB_PASS', 'db_pass'); define('DB_NAME', 'databasename'); ?> db.php: ![]() ![]() <? include('config.php'); function db_connect() { $base = mysql_connect(DB_HOST,DB_USER,DB_PASS) or die('Error: Couldn\'t connect to database server. Please revisit later.'); mysql_select_db(DB_NAME) or die('Error: Couldn\'t select the database. Please visit later.'); return $base; } ?> Ссылки - для оптимизации, global - для работы с большими переменными из глобальной области видимости. 2. Перегрузка функций и множественные аргументы. Скажу сразу - перегрузка функций в PHP запрещена. "Как же так?!" - Скажете вы. - "А как тогда работают функции mail(), setcookie() и так далее?". Такие функции как mail() и setcookie() используют так называемые значения по умолчанию. То есть, для последних аргументов заданы определенные значения по умолчанию (чаще всего - пустая строка), которые будут использованы, если аргумент не передан. Давайте напишем функцию, которая выведет содержимое строки $text, $num раз, после чего выведет сообщение $message: ![]() ![]() function shout($text, $num = 1; $message = '') { for($i = 0; $i < $num; $i++) echo $text; if($message = '') echo $message; // Своеобразная проверка числа аргументов } НО: пропускать аргументы можно только последовательно. Скажем, вы не сможете пропустить $num и задать $message. Вот наша функция в действии: ![]() ![]() shout('Hello'); // Просто выведет Hello shout('Hello', 5); // Выведет Hello 5 раз shout('Hello', 5, 'Web'); // 5 раз выведет Hello, а потом еще и Web 2.1 Множественные аргументы. Вам никогда не хотелось полного контроля над числом параметров функции, как это сделано в C++? Нет проблем, в PHP все гораздо проще. Давайте вот так сразу, с места в карьер, портируем функцию writeln() из Паскаля в PHP: ![]() ![]() function writeln() { $args = func_get_args(); $num = func_num_args(); for($i = 0; $i < $num; $i++) echo $args[$i]."\r\n"; } То есть, вся соль в том, что мы оставляем список аргументов пустым, получаем сами аргументы в виде массива с помощью функции func_get_args(), получаем число аргументов с помощью функции func_num_args() и далее работаем с данными массива как хотим. Помните, что передавать в качестве аргументов можно также массивы и объекты. Есть еще одна функция из этой серии - func_get_arg($index), которая вернет значение аргумента под номером $index. 3. ... и еще чуть-чуть Напоследок расскажу еще о некоторых моментах: 3.1 Возврат ссылок функциями. Если хотите, чтобы ваша функция возвращала ссылку, это нужно сделать так: ![]() ![]() function &foo() { return &$bar; } Как нам поведал rvt, данный прием может не работать, так что будьте осторожны с возвратом ссылок и используйте следующий код: ![]() ![]() function &foo() { return $bar; } $bar = &foo(); 3.2 Переменные функций. Кроме того, в PHP можно даже использовать переменные функций: ![]() ![]() function foo() { echo 'Hello'; } function bar($arg) { echo "Hello, $arg"; } $dynamic_func = 'foo'; $dynamic_func(); // Выведет Hello $dynamic_func = 'bar'; $dynamic_func('Web'); // Выведет Hello, Web 3.3 Интерпретация строки как PHP-кода. Но и это еще не все! Можно даже интерпретировать строку как PHP код: ![]() ![]() $str = 'echo "Hello, World";'; eval($str); // Выведет Hello, World В некоторых ситуациях это может быть полезно. |
Сообщ.
#3
,
|
|
|
Далее приведены вопросы и ответы, перенесенные из предыдущей версии FAQ.
Web-сервер у себя на машине? Автор: Tishaishii Наиболее популярные сервера: - Apache (www.apache.org) - IIS/PWS (www.microsoft.com) Что такое Apache? Web-сервер Apache чаще всего устанавливается на платформах UNIX: - Linux - Solaris - FreeBSD Так же, существуют версии Apache для Windows, начиная с Win95 Преимущества: - Стабильность работы - Модульность сервера - компоненты не входят в стандартный дистрибутив и устанавливаются по необходимости - Наиболее популярный в сети - Гибкость настройки - Отличная документированность - Универсальность - существуют специальные версии для многих ОС - Весь сервер занимает около 12Mb Недостатки: - Отсутствие интерфейса для управления - Сложность настройки Сервера IIS/PWS Входят в дистрибутив Windows 98/NT/2000/XP-Pro Преимущества: - Простота настройки - Есть интерфейс для управления сервером - Неплохая документированность Недостатки: - Слабая гибкость настройки - обилие ненастраиваемых функций "по-умолчанию" - Зависимость от ОС - сервер создан только для Windows |
Сообщ.
#4
,
|
|
|
Как получить файл от клиента, используя PHP?
Автор: SERI Для начала, пусть у нас будет форма в файле upload.html: ![]() ![]() <html> <body> <form enctype="multipart/form-data" action="upload.php" method=post> <input type="hidden" name="MAX_FILE_SIZE" value="1000"> File Name: <input type="file" name="userfile"> <input type="submit" value="Send"> </form> </body> </html> Эта форма будет посылать выбранный файл нашему скрипту. Когда PHP получает такой файл, он записывает принятый файл во временный, и устанавливает несколько переменных: (в нашем случае) $userfile_size - Размер файла в байтах $userfile_name - Имя файла на компе юзера (например, для c:\inet\file.txt это file.txt) $userfile - Имя временной копии файла на сервере. Её можно открыть как обычный файл. Вот пример скрипта, выводящего принятый файл: ![]() ![]() <? echo " <br> Size: $userfile_size<br> Old Name: $userfile_name<br> Temp Name: $userfile<br><pre>"; echo implode ("",file($userfile)); // Выводит файл ?> Коротко о возможных подводных камнях: Текст будет аплоадиться всегда нормально, а вот при аплоаде бинарных файлов есть шанс получить файлы "битыми". Происходит это потому, что Русский Апач по умолчанию перекодирует все подряд. Например 0x00 он заменит 0x20 (пробел) Чтобы с этим бороться, надо в файле настроек httpd.conf прописать что-то типа: ![]() ![]() <Location /> CharsetRecodeMultipartForms Off </Location> |
Сообщ.
#5
,
|
|
|
Как в PHP работать со случайными числами?
Автор: SERI Для этого есть функции rand(), srand(int) и getrandmax(). Для начала, генератор случайных чисел нужно проинициализировать с помощью srand (сколько-то). Для того чтобы убедится, что числа будут действительно случайными, можно например, в начале скрипта вызвать srand(date("s")) После этого функция rand() будет генерировать случайные числа в пределах 0<->getrandmax() Для того, чтобы изменить максимальный предел случайных чисел, достаточно взять остаток деления получившегося числа на новый предел. Например, rand() % 100 даст случайное число в диапазоне от 0 до 100. |
Сообщ.
#6
,
|
|
|
Почему недоступны параметры, переданные PHP скрипту?
Автор: SERI В классическом PHP 3.0 любая переменная, переданая странице через GET / POST / Cookie, немедленно регистрировалась и была доступна на странице. Между тем, в новых версиях PHP и на нестандартных конфигурациях, эта возможность обычно выключена, что приводит к частым проблемам. За включение этой возможности отвечает параметр register_globals в файле php.ini, который, в свою очередь, находится в папке, в которой установлен Windows. Если у Вас есть доступ к этому файлу, достаточно в нем установить register_globals=1. Если же у вас нет прав доступа к этому файлу (если сайт находится на сервере хостера например), вам придется использовать массивы _GET и _POST для получения нужных значений. Пример: File.html ![]() ![]() <html> <head> <title>Example</title> </head> <body> <form action="file.php" method="post"> Ваше имя:<br> <input type=text name="name" maxlength=20 size=30><br> <input type=submit value="Продолжить"> </form> </body> </html> File.php ![]() ![]() <html> <head> <title>Example</title> </head> <body>Hello <? $name = $_POST["name"]; echo $name; ?>! </body> </html> |
Сообщ.
#7
,
|
|
|
Где взять документацию по каждой технологии?
Автор: Mastilior Apache - http://www.apache.org/ Perl - http://www.perldoc.com/ PHP - http://www.php.net/ ASP - http://msdn.microsoft.com/ CSS - http://www.w3.org/ MySQL - http://www.mysql.com/ Переводы спецификаций W3C (World Wide Web Consortium) на русский язык: http://pyramidin.narod.ru/ |
Сообщ.
#8
,
|
|
|
Что такое CGI?
Автор: SERI CGI (Common Gateway Interface) - технология, позволяющая выполнять скрипты на стороне сервера и возвращать результат, вне зависимости от выбранного языка программирования. CGI скрипты можно писать как на специализированных скрипт-языках, так и на обычном C/C++. За счет того, что CGI скрипты выполняются на сервере, на программиста не накладываются никакие ограничения на использование файловой системы, работу с базами данных и т.д. Это, в свою очередь, существенно расширяет возможности сайта. Дополнение от Mastilior: Многие начинающие веб-кодеры часто задают следующий вопрос: "Как напистаь этот скрипт на CGI (или на языке CGI)?". Хочется добавить, что сам CGI - это не язык! CGI - это технология взаимодействия веб-сервера с пользовательским агентом (браузером). |
Сообщ.
#9
,
|
|
|
Какой язык стоит выбрать для написания CGI скриптов?
Автор: SERI На данный момент наиболее популярны PHP, ASP, Perl, C++. Рассмотрим каждый по отдельности. PHP PHP появился не так давно, тем не мение, он успел заслужить прекрасную репутацию простого и удобного средства для создания server-side скриптов. Программы на PHP не компиллируются, а встраиваются в саму страничку и затем интерпретируются. Этот факт не лучшим образом отражается на скорости выполнения скриптов. Однако в четвертой версии языка скорость выполнения была значительно улучшена. PHP наиболе эффективен при использовании вместе с MySQL. ASP По сути, ASP не является языком. Это универсальная технология, активно проталкиваемая Microsoft. Сами скрипты встраиваются в страницы, также как и в PHP. Многие считают, что создавая ресурсоемкий ASP, Microsoft в очередной раз делает из мухи слона, однако, нельзя не согласиться, что писать с использованием ASP очень просто и удобно. Технология хорошо интегрирована с базами данныз ODBC и включает много полезных объектов. На мой взгляд, для сервера IIS - ASP наиболее подходящая среда разработки. Perl Непосвященному человеку perl скрипты кажутся чем-то средним между египетскими иероглифами и исходниками Матрицы. Это неудивительно, потому что perl предоставляет программисту ряд абсолютно новых и необычных средств. В отличии от двух предыдущих технологий, perl - настоящий язык программирования. Он может использоваться и для написания CGI программ, и для обычного системного программирования. Perl сочетает в себе вещи и от компиллятора и от интерпретатора - программы хранятся в исходном виде, но при запуске компиллируются в байт-код. Это положительно отражается на скорости выполнения скриптов. Единственный серьезный недостаток perlа заключается в том, что большинство скриптов на perlе практически нечитабельны. За счет этого язык сложнее в изучении, нежели, например, PHP. C++ и другие языки... Как я уже говорил, CGI скрипты можно писать почти на любом языке. Основная причина, по которой Вы можете решить использовать компилируемый язык типа C++, - это скорость выполнения. Даже самый быстрый интерпретатор не будет работать также быстро, как уже скомпилированная программа. Писать на знакомом языке также проще, чем на новом. Однако написание CGI программ на обычных языках требует хорошего знания технологии CGI и протокола HTTP. |
Сообщ.
#10
,
|
|
|
Как изменить размер изображения в PHP?
Автор: Mastilior ![]() ![]() <? $img = imagecreatefromJpeg("picture.jpg"); $img_width = imagesx($img); $img_height = imagesy($img); $img_new_width = $img_width * 2; $img_new_height = $img_height * 2; $img_new = imagecreatetruecolor($img_new_width, $img_new_height); imagecopyresized($img_new, $img, 0, 0, 0, 0, $img_new_width, $img_new_height, $img_width, $img_height); header("Content-type: image/jpeg"); imagejpeg($img_new); ?> Версия с комментариями прикреплена к данному посту. Прикреплённый файл ![]() |
Сообщ.
#11
,
|
|
|
Ооой. Пытаюсь. Налёживаю вдохновение.
Это называется "Alpha-варсия". *Самый читаемый раздел Где взять Perl? *Учимся читать и писать Структуры данных Perl Ввожу в курс: Если внимательно походить по ссылкам с этих узлов - вполне можно за пару часов насобирать несколько сотен метров бесполезного барахла, и это уже будет совсем другая статья. По-этому лучше остановиться пока на первом варианте (http://www.perl.org), если уж так хочется связаться с этим "Perl". Последняя и предыдущие версии языка, его историю и д.р. можно прочесть на уже дважды указанном сайте http://www.perl.org или на http://www.cpan.org. На http://www.cpan.org так же хранят и преумножают уже огромную коллекцию модулей, жить и работать легче было чтобы. Скачан-таки Perl? Бегло ридми и вэлкомы прочитаны? А "не читал" или "оно же не по-русски написано", однако стоит стать упорным, храбрым, вспомить именитых мастеров и приготовиться к длительным самостоятельным изучениям всякого рода не по-русски написанной, вероятнее небумажной, точно такого же рода документации. Сбор FAQ, README, TUTORIAL и другой, полезной для ума и важной для добычи опыта способности создавать (творчества), силы духа, умения настаивать и побеждать, технической литературы может происходить в местах известных и оживлённых (http://ya.ru, http://forum.sources.ru, это не для заботящихся о покое своём). Тяжело придётся в нашем деле ему, если сколько-то времени уделить занятию упомянотому не пожелает. Следующий этап "установка". В достаточной полноте описан в существующем в архиве с исходниками Perl файле со странным названием "README" (советую ещё взглянуть на содержимое остальных файлов архива). Установка. Для тех, кто дочитал до текущих слов, напомню, Perl со стандартым его набором модулей входит в стандартную же поставку некоторых операционных систем, например, Unix-подобных. Так что для кое-какого овладения и первых тестов установка новейшей версии может не только не понадобиться, но и, так водится, как всякая малообкатанная софтина, поразить своей беспомощьностью. А Perl находится теперь по адресу, содержащемуся в ответе утилиты наподобие whereis: ![]() ![]() whereis perl Как обычно, для Unix-систем это может быть "/usr/bin/perl", а для других, соответственно, другая подходящая диктория. Чтобы получить информацию о версии можно воспользоваться ключом "v": ![]() ![]() perl -v И знать о действии запросов с другими ключами можно употребив лишь один: ![]() ![]() perl -h Куда это всё годится? Perl - прекрасное средство для расслабления во время и после рабоче-трудового дня. Наиболее короткий путь сознания к миру и целостности мироощущения, достижению душевного равновесия - занятие решением задач на Perl. Процесс получения знания о несуществовании ИСТИНЫ сопутствует проявлению усилий для написания FAQ для Perl. И вот ещё: "Я самый Честный и Духовно-Богатый человек на свете", стоит повторять, когда проблема то решается внезапно беспричинно, то та же функция при одном наборе аргументов, без вмешательства действия нормального или какого бы то ни было закона распределения вероятностей, производит отличные от предыдущих операции над объектами. Страх перед неизвестным у человека в первых его мыслях, и не требует специальной подготовки. Потусторонние деяния в таких случаях очевидны. Пропасть открывается. Известно, сначала Perl-язык создан для составления разных отчётов, а сало нам не торт, и ещё развивался и превратился в хобби для поклонников стучания по клавишам до серого утра. И прекрасно, я скажу, справляется. Переработать несколько тысячь почтовых файлов в удобный буклет или структурировать полуструктурированный текст, проанализировать структурированный (и другие), такой задаче моральных усилий потребовать много не удастся, если использовать возможности Perl. Цитата Задолго до интернета люди открыли астрал. |
Сообщ.
#12
,
|
|
|
Слущай, какой базар, аах какой базар, слющай.
Учимся читать и писать В конце-то концов, перейдём к делу, так же до сути не добраться. Perl - совсем не типизированный язык. Это значит, что символы, строки, цифры, числа, массивы и д.р. привычные структуры могут обрабатываться единообразно без каких-то ограничений. Perl расчитан на управление не отдельными типами данных, а их структурами. Структуры данных в Perl Тип структуры указывает префикс в названии переменной ($, @, % или *). Имена переменных в Perl указываются несколькими способами: ![]() ![]() $var, $'var, *::var, %main'var, @one::two'var Перед резделителями "'" и "::" указывают имя пакета, в котором находится переменная. Разделитель "'" считается устаревшим. В Perl несколько переменных могут иметь одинаковые имена и находится в одном пакете если у них разные типы структур. Если последовательно инициализировать: ![]() ![]() %::a=(a=>'b', c=>'e'); $::a="abcdefg"; @::a=('aA', 'bB', 'cC'); Скаляры Скаляр - строка, цифра, число, отдельный символ, указатель на структуру. Например, представление скаляра с содержимым "-1024": ![]() ![]() $uy'_0=1024.0; $scalar::_1=-1_02_4; $::i'go'go::_2=-1e+1.24; $oogo_3="-0x400"; $scalar'_4='-1024'; $____'_5='Одна тысяча двадцать четыре'; Скаляр так же может содержать ссылку на именованный или безымянный объект (возможно тоже ссылку). Чтобы создать ссылку на структуру (объект) нужно поставить перед его указанием символ "\". ![]() ![]() $var=\1; #ссылка на безымянный объект $var=\\\"1"; #ссылка на ссылку на ссылку на безымянный объект $a=1; $var=\$a; #ссылка на именованый объект Списки скаляров В языке реализованы только списки скаляров, чего вполне достаточно для создания любых сложных структур. Список усложняется за счёт скалярных ссылок на другие структуры. Примеры списков: ![]() ![]() @var=(1, 2, 3); @var=(1 .. 3, 5 .. 9); ($a, $b, $c)=(1, 2, 3); ($a, $b, $c)=@var; ($a, $b, $c)=($c, $a, $b); @var=('d'..'t', 'Z', 1 ,'A'..'Z'); Если вместо префикса "@" в имени списка указано "$#", то возвращается число=длина_массива - 1, что удобно для указания последнего элемента массива по индексу. Можно получить доступ к элементу (скаляру) списка по индексу так: ![]() ![]() @var=1; # @var=(1); @var=1..3; # @var=(1, 2, 3) $var[1]=10; # Теперь @var=(1, 10, 3); # Если @var=1..3; $var[-1]=10; # или $var[ 2]=10; # или $var[$#var]=10; # теперь @var=(1, 2, 10) Или получить часть массива по индексам: ![]() ![]() @var=1..10; @var1=(8, 7, 1..4); @var[@var1] = @var[5..$#var, 1]; # @var=(1, 8, 9, 10, 2, 6, 7, 7, 6, 10) #или безымянный массив @var=('a'..'z')[4, 2, 10..15, 0, 1, -1, -12]; # @var=('e', 'c', 'k', 'l', 'm', 'n', 'o', 'p', 'a', 'b', 'z', 'o') Так же при содании ссылок: ![]() ![]() $var=\$var[-5]; #ссылка на элемент списка $var[$#var+1-5] # ! образуется 2 переменных $var-скалярная и остаётся @var-списочная. @var2=\(@var1); # создаётся список @var2 с элементами-ссылками на соответствующие элементы списка @var1 $var=\@var; # создаётся скаляр $var со ссылкой на массив @var $var=\(1..4); # ! тоже создаётся ссылка, но на безымянный массив Длину списка можно измерить так: ![]() ![]() $len=$#var+1; # это уже знаем $len=@var; # здесь затрагивается тема про контексты, и про это тоже позже. # Список в скалярном контексте возвращает свою длину - число Хэш-массивы: В Perl хэш-массив - это список, состоящий из двух частей: ключ и соответствующее ему значение. Пример: ![]() ![]() %var=( key1=>'val1', # если ключ состоит только из цифр, латинских букв и символов "_", # кавычки в названии можно не указывать 'key2'=>$val2, key3, "val3" ); Получить элемент хэш-массива по ключу: ![]() ![]() %var=('blue', 'Чёрный', 'red', 'Красный', 'green', 'Зелёный'); $blue=$var{blue}; # создаётся переменная-скаляр "blue" со значением "Синий" $redref=\$var{red}; # создаётся переменная-ссылка "redref" на содержимое "Красный" Получить часть хэш-массива по ключам: ![]() ![]() %var=('blue'=>'Чёрный', 'red'=>'Красный', 'green'=>'Зелёный'); @rgb=@var{'red', 'green', 'blue'}; # создаётся переменная-список @black # со значением ('Красный', 'Зелёный', 'Синий') @rgbnames=('red', 'green', 'blue'); @rgbref=\(@var{@rgbnames}); # создаётся переменная-список ссылок $rgbref # на безымянный массив на значения под ключами @rgbnames # хэш-массива %var # типа: @rgbref=(\'Красный', \'Зелёный', \'Синий') Списки преобразовываются в хэш-массивы и обратно: ![]() ![]() @var=('black', 'Чёрный', 'red', 'Красный', 'green', 'Зелёный'); %var=@var; # образуется хэш-массив типа: # %var=( # black=>'Чёрный', # red=>'Красный', # green=>'Зелёный' # ); @var=%var; # получается исходный список # @var=('black', 'Чёрный', 'red', 'Красный', 'green', 'Зелёный'); Указатели из таблицы символов переменных Непосредственно с таблицей символов Perl часто работать, думаю, не придётся. Эта таблица хранит имена переменных и необходимую для управления ими информацию (тип, адрес в памяти, счётчик ссылок, и т.д.). Если в таблице символов нет записи о переменной - она не существует. Чаще всего, переменные этого типа создаются пользователем как файловые указатели. Об этом тоже позже. Думаю, в статье "Ввод и вывод". Примеры: ![]() ![]() *STDIN, *::STDOUT, *'STDERR; В следующих статьях: Разименование, Ввод-вывод и др. |
Сообщ.
#13
,
|
|
|
Не описанные особенности из предыдущей статьи
Это из-за гибкости синтаксиса языка. Думаю, на этот раз все случаи тоже описать не удастся. Слишком уж много вариантов. Ссылки на безымянные списки и на хэш-массивы * Массивом буду называть ссылку на список В прошлой статье я так и не объяснил как создать подобие матрицы. Исправляюсь. Матрица 3 x 4: ![]() ![]() @matrix=( (1, 2, 3, 4), ('a'..'d'), (5..8) ); # Получаем всю третью строчку: $row3=$matrix[2]; # или $row3=$matrix[-1]; # в $row3 записано (5..8) # Получаем всю вторую строчку: $row2=$matrix[1]; # или $row3=$matrix[-2]; # в $row2 записано ('a'..'d') # Получаем всю первую строчку: $row1=$matrix[0]; # или $row3=$matrix[-3]; # в $row1 записано (1, 2, 3, 4) # Всё прекрасно получается. # Проверка: print $row1, ', ', $row2, ', ', $row3, "\n"; # На перёд, print - функция вывода. # Получает список аргументов и распечатывает их содержимое в # стандартный поток вывода (но не только, объясню в статье "Ввод\Вывод") # Итак, вывод: 1, 2, 3 # Всё прекрасно получается. Простые махинации со списками Напоминаю: спискив Perl состоят из скаляров и только из скаляров. Сейчас попробую объяснить почему. * Конкатенация списков - объединение. Из множества элементов списков создаётся новый список, содержащий все элементы объединённых списков с повторами. Примеры объединения списков: ![]() ![]() @var1=(1..4); @var2=('k'..'n'); @var3=(@var1, @var2); # или @var3=((1..4), ('k'..'n')); # или @var3=(1..4, 'k'..'n'); # теперь в @var3 находится (1, 2, 3, 4, 'k', 'l', 'm', 'n') @var4=(((((((1)))))),(2)); # @var4=(1, 2); @var5=@var1, @var2; # @var5=1..4; Объединение списков со списками равносильно созданию нового списка из скалярных элементов списков. Примеры объединения списков и скаляров: ![]() ![]() $var1=1; @var1=('1'..'4'); @var2=(@var1, $var1); # @var2=('1', '2', '3', '4', 1); ($var1, $var2, $var3)=(1, 2, 3); @var3=($var2, $var3, @var2, $var1); # @var3=(2, 3, '1', '2', '3', '4', 1, 1); Теперь, думаю, понятно, почему сразу не получилось создать матрицу. Вместо матрицы получился список с 3*4=12 элементами. И ещё одна особенность, уже из темы "Контекст" ![]() ![]() ($a, $b, @var)=(1..4); # $a=1; $b=2; @var=(3, 4); (@a, $b, @c)=(4..8); # @a=(4, 5, 6, 7, 8); $b=undef; @c=(); ($a, $b, %c)=(1, 2, key1=>'a', key2=>'b'); # $a=1; $b=2; %c=(key1=>'a', key2=>'b'); Создаём матрицу: ![]() ![]() $row1=\(1..4); $row2=\('1'..'4'); $row3=\('a'..'d'); @matrix=( $row1, $row2, $row3 ); # Создали промежуточные бесполезные переменные $row1, $row2, $row3 # Можно записать ещё так: @matrix=( \(1..4), \('1'..'4'), \('a'..'d') ); # А можно ещё короче: @matrix=( [1..4], ['1'..'4'], ['a'..'d'] ); $array_ref=[1..4]; # ссылка на список (1, 2, 3, 4) # список @matrix состоит только из скаляров, однако содержит скалярные же ссылки на другие списки. Список в квадратных скобках - это ссылка на список. Как получить доступ к элементам матрицы скажу позже. Ссылка на безымянный хэш-массив Сначала, о преобразовании списков в хэш-массивы и обратно. ![]() ![]() @var1=( key1=>'val1', key2=>'val2', key3=>'val3' ); %var1=@var1; @var1=%var1; У меня получилось, что в @var1 теперь содержится ![]() ![]() @var1=(key1, 'val1', key2, 'val2', key3, 'val3') На такое везение полагаться вовсе не стоит, т.к. в хэш-массивах данные хранятся не в прямом а в некотором "оптимальном" для оперирования порядке. Важно, что при прямом и обратном преобразовании сохраняются все элементы списка. С помощью преобразования в хэш-массив и обратно можно избавляться от одинаковых элементов в списке, т.к. ключи у хэш-массивов не могут быть одинаковыми. ![]() ![]() @var=('a', 'b', 'a', 2, 'c', 'c', 'd'); %var=@var; @var=%var; # теперь в @var содержится что-то вроде ('a', '2', 'c', 'c', 'd', undef), но не именно в том самом порядке, элементы в хэш-массиве хранятся в любом "удобном" для оперирования порядке! Теперь уже традициионное, создание двухмерной матрицы из хэш-массивов: ![]() ![]() $row1=\(1=>'a', 'a'=>1); # для задания ссылки на строку-хэш-массив используется соответствующий стиль. # однако, это ещё одни на первых порах часто встречающиеся грабли. На самом деле, # $row1 теперь содержит ссылку на список. # Вот как можно сделать: %row1=(1=>'a', 'a', 1); # стиль задания элементов списка или хэш-массива вообще ни на что кроме читабельности не влияет. В обоих случаях можно беспорядочно использовать оба варианта ("," или "=>"). $row1=\%row1; %row2=(2, 'b', 'b', 2); %matrix=( row1=>$row1, row2=>\%row2, # а можно так: row3=>{ 3=>'c', 4=>'d' } ); Список в фигурных скобках - это ссылка на хэш-массив. Как получить доступ к элементам матрицы скажу позже. Это не было трудно, но из таких простых элементов строятся любые струтуры. Чуть-чуть ещё. |
Сообщ.
#14
,
|
|
|
Как определить IP-адрес клиента?
Автор: Mastilior и Budda PHP ![]() ![]() $ip = $_SERVER["HTTP_CLIENT_IP"]; if (empty($ip)) $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]); if (empty($ip)) $ip = $_SERVER["REMOTE_ADDR"]); Perl ![]() ![]() my $IPAddr1 = $ENV{'HTTP_CLIENT_IP'}; if ($IPAddr1 eq "") { $IPAddr1 = $ENV{'REMOTE_ADDR'}; } my $IPAddr2 = ""; if ($ENV{'HTTP_X_FORWARDED_FOR'}) { $IPAddr2 = $IPAddr1; $IPAddr1 = $ENV{'HTTP_X_FORWARDED_FOR'}; } JavaScript (серверный!) ![]() ![]() var ip = ssjs_getCGIVariable("REMOTEADDR"); write(ip); JavaScript (клиентский) Невозможно! Клиентский JavaScript - это язык скриптов, которые выполняются на машине пользователя. |
Сообщ.
#15
,
|
|
|
Как записать большой текстовый блок в программу на Perl?
...а потом ещё и прочитать его? Автор: Tishaishii ![]() ![]() package Текущий_Пакет; #............................... print while <Текущий_Пакет::DATA>; #или open DATA, '<&Текущий_Пакет::DATA'; # копирование ссылки на "Текущий_Пакет::DATA" через функцию "open" print while <DATA>; close DATA; #............................... +1; #конец программы __DATA__ Вот тут можно написать много всякого-разного и засунуть сюда огромный текстовый блок |