На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: Serafim, fatalist
Закрыто negram 03-12-2010:

Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
  • закрыта
> FAQ, прежде чем задать вопрос, смотри сюда
    Если у Вас возникли какие-либо вопросы по данному FAQ'у, замечания можно оставить в следующей теме: Обсуждение FAQ-ов

    Отправка e-mail сообщений в PHP.

    Здесь я попытаюсь кратко изложить основные возможности отправки электронной почты в PHP.


    1. Функция mail().

    Действия функции mail() зависят от операционной системы. В UNIX она попытается использовать процесс программы SendMail для отправки сообщения. В Windows она пытается использовать SMTP или же внутреннюю эмуляцию процесса SendMail.

    Прототип функции выглядит так:
    ExpandedWrap disabled
      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":
    ExpandedWrap disabled
      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():
    ExpandedWrap disabled
      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 Создание объекта:
    ExpandedWrap disabled
      $m = new Mail(); // Теперь $m - объект класса Mail


    4.1 Метод Host(). Этот метод определяет имя сервера, который будет использован для отправки сообщения. По умолчанию будет использован localhost. Если вы хотите использовать другой сервер, нужно сделать это так:
    ExpandedWrap disabled
      $m->Host("mail.myhost.com"); // Будем отправлять писмо с mail.myhost.com


    4.2 Метод Username() и Password(). Устанавливают имя пользователя и пароль для SMTP аутентификации. ВНИМАНИЕ: используйте только если сервер требует аутентификации для SMTP!
    ExpandedWrap disabled
      $m->Username("admin"); // Используем пользователя admin
      $m->Password("sWordFiSH"); // Пароль - sWordFiSH


    4.3 Метод Content_type(). Устанавливает тип содержимого письма.
    ExpandedWrap disabled
      $m->Content_type("text/html"); // Письмо в виде HTML


    4.4 Метод autoCheck(). Проверять правильность адресов e-mail или нет? По умолчанию - false.
    ExpandedWrap disabled
      $m->autoCheck(true); // Будем проверять адреса


    4.5 Метод Subject(). Устанавливает тему сообщения. Пример:
    ExpandedWrap disabled
      $m->Subject("How to make million dollars per day."); // Без комментариев


    4.6 Метод From(). Устанавливает адрес отправителя. По умолчанию - nobody@localhost.
    ExpandedWrap disabled
      $m->From("user@host.com"); // Отправляем с адреса user@host.com


    4.7 Метод ReplyTo(). Адрес, на который будут приходить ответы.
    ExpandedWrap disabled
      mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
      "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
    000

    4.8 Метод To(). Добавляет нового адресата в список "To:". После вызова Send писмьмо будет отправлено по всем адресам из списка. Пример:
    ExpandedWrap disabled
      mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
      "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
    111

    4.9 Метод Cc(). То же, что и метод To(), но для поля "CC:".

    4.10 Метод Bcc(). То же, что и To(), но для "BCC" ("Blank Carbon Copy").

    4.11 Метод Body(). Устанавливает текст сообщения, принимая его в качестве первого аргумента. В качестве второго аргумента можно (но необязательно) указать кодировку письма.
    ExpandedWrap disabled
      mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
      "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
    222

    4.12 Метод Organization(). Устанавливает вашу организацию. Пример:
    ExpandedWrap disabled
      mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
      "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
    333

    4.13 Метод Priority(). Устанавливает приоритет письма (1 - самый высокий, 2 - высокий, 3 - нормальный, 4 - низкий, 5 - самый низкий).
    ExpandedWrap disabled
      mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
      "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
    444

    4.14 Метод Attach(). Прикрепляет файл к письму (можно прикреплять несколько файлов). Первый аргумент - путь к файлу, второй (необязательно) - его MIME тип, третий (необязательно) - его dispostion (inline - клиенту можно его отобразить, attachment - обязательно сохранить на диске), по умолчанию inline.
    ExpandedWrap disabled
      mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
      "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
    555

    4.15 Метод Send(). Производит отправку письма:
    ExpandedWrap disabled
      mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
      "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
    666

    4.16 Метод Get(). Выводит письмо таким, каким его получит клиент.
    ExpandedWrap disabled
      mail("john@doe.com", "PHP mail() Test", "Это письмо отправлено функцией mail() из PHP скрипта",
      "From: admin@microsoft.com\r\nX-Mailer: E-mail Terminator v.1000") or die("Ошибка: не получилось отправить письмо!");
    777


    Подведем итоги.
    Плюсы: универсальность и сочетание всех необходимых возможностей.
    Минусы: надеюсь, что их нет...
    Сообщение отредактировано: Рысь -

    Прикреплённый файлПрикреплённый файлphp_mail.zip (7.88 Кбайт, скачиваний: 552)
    May the Source be with you!
      Функции в PHP
      Несколько интересных моментов из жизни функций в PHP.

      1. Передача аргументов по ссылке, глобальная область видимости, константы.

      Обычно все аргументы в PHP передаются по значению, то есть если мы предаем функции foo() аргумент $bar, то для использования в теле foo() будет создана локальная копия $bar. Все бы хорошо, но что будет если $bar содержит, скажем, дамп базы данных? Тогда производительность резко упадет, и скрипт будет занимать большой объем памяти. В таком случае следует использовать передачу аргумента по ссылке.
      Кроме того, если аргумент был передан по ссылке, то функция легко изменит его значение, не прибегая к средствам return.

      Итак, есть два способа передачи аргументов по ссылке:

      1.1. Ссылка (&) в списке аргументов.

      Этот способ используется при написании кода функции. Если вы хотите, чтобы аргумент $bar передавался вашей функции foo по ссылке, можно сделать это так:
      ExpandedWrap disabled
        function foo(&$bar)
        {
                echo $bar;
                $bar = '';
        }

      Эта функция будет принимать строку по ссылке, выводить ее содержимое, а потом очищать (присваивать переменной $bar пустую строку).

      1.2 Передача ссылки в качестве аргумента.

      Можно написать функцию, которая будет работать как со ссылками, так и с обычными аргументами:
      ExpandedWrap disabled
        function foo($bar)
        {
                $bar .= "; Передана по ссылке";  // Если переменная передана по ссылке, мы можем изменять ее значение.
        }
        $str = "Строка";
        foo($str);
        echo $str; // Выведет: Строка
        foo(&$str);
        echo $str; // Выведет: Строка; Передана по ссылке

      А если вы просто заботитесь о производительности, то можно передавать переменную по ссылке любой функции:
      ExpandedWrap disabled
        $result = some_function(&$argument);


      1.3 Глобальные переменные.

      В коде функции можно объявить о том, что данную переменную нужно взять из глобальной области видимости. Фактически, эффект тот же, что и от передачи по ссылке. Разница в том, что для этого не нужно ничего объявлять в списке аргументов. Пусть функция process_array() производит оработку массива $big_array:
      ExpandedWrap disabled
        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 Константы.

      Константы - отдельная статья. Они объявляются в глобальной области видимости и доступны отовсюду. В отличие от переменной, для доступа к константе не нужен знак доллара ($) и изменять значение уже объявленной константы запрещено.
      ExpandedWrap disabled
        <?
        // Чтобы не путать с функциями, констанам обычно дают имена верхнего регистра.
        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:
      ExpandedWrap disabled
        <?
        define('DB_HOST', 'localhost');
        define('DB_USER', 'db_user');
        define('DB_PASS', 'db_pass');
        define('DB_NAME', 'databasename');
        ?>

      db.php:
      ExpandedWrap disabled
        <?
        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:
      ExpandedWrap disabled
        function shout($text, $num = 1; $message = '')
        {
                for($i = 0; $i < $num; $i++) echo $text;
                if($message = '') echo $message; // Своеобразная проверка числа аргументов
        }

      НО: пропускать аргументы можно только последовательно. Скажем, вы не сможете пропустить $num и задать $message.
      Вот наша функция в действии:
      ExpandedWrap disabled
        shout('Hello'); // Просто выведет Hello
        shout('Hello', 5); // Выведет Hello 5 раз
        shout('Hello', 5, 'Web'); // 5 раз выведет Hello, а потом еще и Web


      2.1 Множественные аргументы.

      Вам никогда не хотелось полного контроля над числом параметров функции, как это сделано в C++? Нет проблем, в PHP все гораздо проще.
      Давайте вот так сразу, с места в карьер, портируем функцию writeln() из Паскаля в PHP:
      ExpandedWrap disabled
        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 Возврат ссылок функциями.

      Если хотите, чтобы ваша функция возвращала ссылку, это нужно сделать так:
      ExpandedWrap disabled
        function &foo()
        {
                return &$bar;
        }

      Как нам поведал rvt, данный прием может не работать, так что будьте осторожны с возвратом ссылок и используйте следующий код:
      ExpandedWrap disabled
        function &foo()
        {
                return $bar;
        }
        $bar = &foo();


      3.2 Переменные функций.

      Кроме того, в PHP можно даже использовать переменные функций:
      ExpandedWrap disabled
        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 код:
      ExpandedWrap disabled
        $str = 'echo "Hello, World";';
        eval($str); // Выведет Hello, World

      В некоторых ситуациях это может быть полезно.
      Сообщение отредактировано: Soul :) -
      May the Source be with you!
        Далее приведены вопросы и ответы, перенесенные из предыдущей версии FAQ.

        Web-сервер у себя на машине?

        Автор: Tishaishii
        • Появляется важная возможность подробнее ознакомиться с управлением и работой со средствами, котороые могли казаться раньше почти невероятными и загадочными. Становится доступным, например, создание собственного полноценного web-узла в интернет, его администрирование.
        • Вы сможете разрабатывать и тестировать программы для Internet без дополнительных затрат времени и средств.
        Наиболее популярные сервера:
        - 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
        :-р
          Как получить файл от клиента, используя PHP?

          Автор: SERI

          Для начала, пусть у нас будет форма в файле upload.html:

          ExpandedWrap disabled
             
            <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 - Имя временной копии файла на сервере. Её можно открыть как обычный файл.

          Вот пример скрипта, выводящего принятый файл:

          ExpandedWrap disabled
             
            <?
            echo " <br> Size: $userfile_size<br>
            Old Name: $userfile_name<br>
            Temp Name: $userfile<br><pre>";
            echo implode ("",file($userfile)); // Выводит файл
            ?>


          Коротко о возможных подводных камнях:
          Текст будет аплоадиться всегда нормально, а вот при аплоаде бинарных файлов есть шанс получить файлы "битыми".
          Происходит это потому, что Русский Апач по умолчанию перекодирует все подряд. Например 0x00 он заменит 0x20 (пробел)
          Чтобы с этим бороться, надо в файле настроек httpd.conf прописать что-то типа:

          ExpandedWrap disabled
             
            <Location />
            CharsetRecodeMultipartForms Off
            </Location>
          :-р
            Как в PHP работать со случайными числами?

            Автор: SERI

            Для этого есть функции rand(), srand(int) и getrandmax().

            Для начала, генератор случайных чисел нужно проинициализировать с помощью srand (сколько-то). Для того чтобы убедится, что числа будут действительно случайными, можно например, в начале скрипта вызвать srand(date("s"))

            После этого функция rand() будет генерировать случайные числа в пределах 0<->getrandmax()
            Для того, чтобы изменить максимальный предел случайных чисел, достаточно взять остаток деления получившегося числа на новый предел.
            Например, rand() % 100 даст случайное число в диапазоне от 0 до 100.
            :-р
              Почему недоступны параметры, переданные PHP скрипту?

              Автор: SERI

              В классическом PHP 3.0 любая переменная, переданая странице через GET / POST / Cookie, немедленно регистрировалась и была доступна на странице.
              Между тем, в новых версиях PHP и на нестандартных конфигурациях, эта возможность обычно выключена, что приводит к частым проблемам.
              За включение этой возможности отвечает параметр register_globals в файле php.ini, который, в свою очередь, находится в папке, в которой установлен Windows.

              Если у Вас есть доступ к этому файлу, достаточно в нем установить register_globals=1.

              Если же у вас нет прав доступа к этому файлу (если сайт находится на сервере хостера например), вам придется использовать массивы _GET и _POST для получения нужных значений.

              Пример:
              File.html
              ExpandedWrap disabled
                 
                <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
              ExpandedWrap disabled
                 
                <html>
                <head>
                <title>Example</title>
                </head>
                <body>Hello
                <?
                $name = $_POST["name"];
                echo $name;
                ?>!
                </body>
                </html>
              :-р
                Где взять документацию по каждой технологии?

                Автор: 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/
                :-р
                  Что такое CGI?

                  Автор: SERI

                  CGI (Common Gateway Interface) - технология, позволяющая выполнять скрипты на стороне сервера и возвращать результат, вне зависимости от выбранного языка программирования.

                  CGI скрипты можно писать как на специализированных скрипт-языках, так и на обычном C/C++. За счет того, что CGI скрипты выполняются на сервере, на программиста не накладываются никакие ограничения на использование файловой системы, работу с базами данных и т.д.

                  Это, в свою очередь, существенно расширяет возможности сайта.

                  Дополнение от Mastilior:

                  Многие начинающие веб-кодеры часто задают следующий вопрос: "Как напистаь этот скрипт на CGI (или на языке CGI)?". Хочется добавить, что сам CGI - это не язык! CGI - это технология взаимодействия веб-сервера с пользовательским агентом (браузером).
                  :-р
                    Какой язык стоит выбрать для написания 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.
                    :-р
                      Как изменить размер изображения в PHP?

                      Автор: Mastilior

                      ExpandedWrap disabled
                         
                        <?
                        $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);
                        ?>


                      Версия с комментариями прикреплена к данному посту.
                      Прикреплённый файлПрикреплённый файлimage_resize.zip (0.61 Кбайт, скачиваний: 340)
                      :-р
                        Ооой. Пытаюсь. Налёживаю вдохновение.
                        Это называется "Alpha-варсия".




                        *Самый читаемый раздел Где взять Perl?
                        • Куда это всё годится?
                        • Что с ним делать?
                        *Учимся читать и писать Структуры данных 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:
                        ExpandedWrap disabled
                          whereis perl

                        Как обычно, для Unix-систем это может быть "/usr/bin/perl", а для других, соответственно, другая подходящая диктория.

                        Чтобы получить информацию о версии можно воспользоваться ключом "v":
                        ExpandedWrap disabled
                          perl -v

                        И знать о действии запросов с другими ключами можно употребив лишь один:
                        ExpandedWrap disabled
                          perl -h


                        Куда это всё годится?

                        Perl - прекрасное средство для расслабления во время и после рабоче-трудового дня. Наиболее короткий путь сознания к миру и целостности мироощущения, достижению душевного равновесия - занятие решением задач на Perl. Процесс получения знания о несуществовании ИСТИНЫ сопутствует проявлению усилий для написания FAQ для Perl. И вот ещё: "Я самый Честный и Духовно-Богатый человек на свете", стоит повторять, когда проблема то решается внезапно беспричинно, то та же функция при одном наборе аргументов, без вмешательства действия нормального или какого бы то ни было закона распределения вероятностей, производит отличные от предыдущих операции над объектами. Страх перед неизвестным у человека в первых его мыслях, и не требует специальной подготовки. Потусторонние деяния в таких случаях очевидны. Пропасть открывается.

                        Известно, сначала Perl-язык создан для составления разных отчётов, а сало нам не торт, и ещё развивался и превратился в хобби для поклонников стучания по клавишам до серого утра. И прекрасно, я скажу, справляется. Переработать несколько тысячь почтовых файлов в удобный буклет или структурировать полуструктурированный текст, проанализировать структурированный (и другие), такой задаче моральных усилий потребовать много не удастся, если использовать возможности Perl.




                        Цитата
                        Задолго до интернета люди открыли астрал.
                        Сообщение отредактировано: Tishaishii -
                          Слущай, какой базар, аах какой базар, слющай.



                          Учимся читать и писать
                          В конце-то концов, перейдём к делу, так же до сути не добраться.
                          Perl - совсем не типизированный язык. Это значит, что символы, строки, цифры, числа, массивы и д.р. привычные структуры могут обрабатываться единообразно без каких-то ограничений. Perl расчитан на управление не отдельными типами данных, а их структурами.

                          Структуры данных в Perl
                          • ($SCALAR) скаляры
                          • (@ARRAY) списки скаляров
                          • (%HASH) хэш-массивы
                          • (*GLOB) указатели из таблицы символов

                          Тип структуры указывает префикс в названии переменной ($, @, % или *).
                          Имена переменных в Perl указываются несколькими способами:
                          ExpandedWrap disabled
                            $var, $'var, *::var, %main'var, @one::two'var

                          Перед резделителями "'" и "::" указывают имя пакета, в котором находится переменная. Разделитель "'" считается устаревшим.
                          • Имена пакетов и переменных могут содержать латинские буквы, цифры, и символ "_".
                          • Если перед разделителем не указано имя пакета, по-умолчанию принимается пакет "main" - пакет основной программы. Имя пакета "main" принято не указывать.
                          • Если не указано имя переменной - осуществляется досутп к таблице символов указанного пакета. Об этом позже.

                          В Perl несколько переменных могут иметь одинаковые имена и находится в одном пакете если у них разные типы структур.
                          Если последовательно инициализировать:
                          ExpandedWrap disabled
                             
                                %::a=(a=>'b', c=>'e');
                                $::a="abcdefg";
                                @::a=('aA', 'bB', 'cC');
                          то образуется три разных переменных в пакете "main" с именем "a", которые находятся в разных областях памяти.

                          Скаляры
                          Скаляр - строка, цифра, число, отдельный символ, указатель на структуру.
                          Например, представление скаляра с содержимым "-1024":
                          ExpandedWrap disabled
                             
                                $uy'_0=1024.0;
                                $scalar::_1=-1_02_4;
                                $::i'go'go::_2=-1e+1.24;
                                $oogo_3="-0x400";
                                $scalar'_4='-1024';
                                $____'_5='Одна тысяча двадцать четыре';


                          Скаляр так же может содержать ссылку на именованный или безымянный объект (возможно тоже ссылку).
                          Чтобы создать ссылку на структуру (объект) нужно поставить перед его указанием символ "\".
                          ExpandedWrap disabled
                             
                                $var=\1; #ссылка на безымянный объект
                                $var=\\\"1"; #ссылка на ссылку на ссылку на безымянный объект
                                $a=1; $var=\$a; #ссылка на именованый объект


                          Списки скаляров
                          В языке реализованы только списки скаляров, чего вполне достаточно для создания любых сложных структур. Список усложняется за счёт скалярных ссылок на другие структуры.

                          Примеры списков:
                          ExpandedWrap disabled
                             
                                @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, что удобно для указания последнего элемента массива по индексу. Можно получить доступ к элементу (скаляру) списка по индексу так:
                          ExpandedWrap disabled
                             
                                @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)

                          Или получить часть массива по индексам:
                          ExpandedWrap disabled
                             
                                @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')

                          Так же при содании ссылок:
                          ExpandedWrap disabled
                             
                                $var=\$var[-5]; #ссылка на элемент списка $var[$#var+1-5]
                                    # ! образуется 2 переменных $var-скалярная и остаётся @var-списочная.
                             
                                @var2=\(@var1); # создаётся список @var2 с элементами-ссылками на соответствующие элементы списка @var1
                                $var=\@var; # создаётся скаляр $var со ссылкой на массив @var
                                $var=\(1..4); # ! тоже создаётся ссылка, но на безымянный массив


                          Длину списка можно измерить так:
                          ExpandedWrap disabled
                             
                                $len=$#var+1; # это уже знаем
                                $len=@var; # здесь затрагивается тема про контексты, и про это тоже позже.
                                # Список в скалярном контексте возвращает свою длину - число


                          Хэш-массивы:

                          В Perl хэш-массив - это список, состоящий из двух частей: ключ и соответствующее ему значение.
                          Пример:
                          ExpandedWrap disabled
                            %var=(
                                    key1=>'val1',
                                        # если ключ состоит только из цифр, латинских букв и символов "_",
                                        # кавычки в названии можно не указывать
                                    'key2'=>$val2,
                                    key3, "val3"
                            );


                          Получить элемент хэш-массива по ключу:
                          ExpandedWrap disabled
                             
                                %var=('blue', 'Чёрный', 'red', 'Красный', 'green', 'Зелёный');
                                $blue=$var{blue};
                                    # создаётся переменная-скаляр "blue" со значением "Синий"
                                $redref=\$var{red};
                                    # создаётся переменная-ссылка "redref" на содержимое "Красный"


                          Получить часть хэш-массива по ключам:
                          ExpandedWrap disabled
                             
                                %var=('blue'=>'Чёрный', 'red'=>'Красный', 'green'=>'Зелёный');
                                @rgb=@var{'red', 'green', 'blue'};
                                    # создаётся переменная-список @black
                                    # со значением ('Красный', 'Зелёный', 'Синий')
                                @rgbnames=('red', 'green', 'blue');
                                @rgbref=\(@var{@rgbnames});
                                    # создаётся переменная-список ссылок $rgbref
                                    # на безымянный массив на значения под ключами @rgbnames
                                    # хэш-массива %var
                                    # типа: @rgbref=(\'Красный', \'Зелёный', \'Синий')


                          Списки преобразовываются в хэш-массивы и обратно:
                          ExpandedWrap disabled
                             
                                @var=('black', 'Чёрный', 'red', 'Красный', 'green', 'Зелёный');
                                %var=@var;
                                    # образуется хэш-массив типа:
                                    # %var=(
                                    #   black=>'Чёрный',
                                    #   red=>'Красный',
                                    #   green=>'Зелёный'
                                    # );
                                @var=%var;
                                    # получается исходный список
                                    # @var=('black', 'Чёрный', 'red', 'Красный', 'green', 'Зелёный');


                          Указатели из таблицы символов переменных
                          Непосредственно с таблицей символов Perl часто работать, думаю, не придётся. Эта таблица хранит имена переменных и необходимую для управления ими информацию (тип, адрес в памяти, счётчик ссылок, и т.д.). Если в таблице символов нет записи о переменной - она не существует.
                          Чаще всего, переменные этого типа создаются пользователем как файловые указатели. Об этом тоже позже. Думаю, в статье "Ввод и вывод".

                          Примеры:
                          ExpandedWrap disabled
                            *STDIN, *::STDOUT, *'STDERR;





                          В следующих статьях: Разименование, Ввод-вывод и др.
                          Сообщение отредактировано: Tishaishii -
                            Не описанные особенности из предыдущей статьи

                            Это из-за гибкости синтаксиса языка. Думаю, на этот раз все случаи тоже описать не удастся. Слишком уж много вариантов.
                            • Ссылки на безымянные списки
                            • Простые махинации со списками
                            • Ссылки на безымянные хэш-массивы и махинации со списками

                            Ссылки на безымянные списки и на хэш-массивы

                            * Массивом буду называть ссылку на список

                            В прошлой статье я так и не объяснил как создать подобие матрицы.
                            Исправляюсь. Матрица 3 x 4:
                            ExpandedWrap disabled
                               
                                  @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 состоят из скаляров и только из скаляров. Сейчас попробую объяснить почему.

                            * Конкатенация списков - объединение. Из множества элементов списков создаётся новый список, содержащий все элементы объединённых списков с повторами.

                            Примеры объединения списков:
                            ExpandedWrap disabled
                               
                                  @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;


                            Объединение списков со списками равносильно созданию нового списка из скалярных элементов списков.

                            Примеры объединения списков и скаляров:
                            ExpandedWrap disabled
                               
                                  $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 элементами.

                            И ещё одна особенность, уже из темы "Контекст"

                            ExpandedWrap disabled
                               
                                  ($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');


                            Создаём матрицу:
                            ExpandedWrap disabled
                               
                                  $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 состоит только из скаляров, однако содержит скалярные же ссылки на другие списки.


                            Список в квадратных скобках - это ссылка на список.
                            Как получить доступ к элементам матрицы скажу позже.

                            Ссылка на безымянный хэш-массив

                            Сначала, о преобразовании списков в хэш-массивы и обратно.

                            ExpandedWrap disabled
                               
                                  @var1=(
                                      key1=>'val1',
                                      key2=>'val2',
                                      key3=>'val3'
                                  );
                                  %var1=@var1;
                                  @var1=%var1;


                            У меня получилось, что в @var1 теперь содержится
                            ExpandedWrap disabled
                               
                                  @var1=(key1, 'val1', key2, 'val2', key3, 'val3')

                            На такое везение полагаться вовсе не стоит, т.к. в хэш-массивах данные хранятся не в прямом а в некотором "оптимальном" для оперирования порядке. Важно, что при прямом и обратном преобразовании сохраняются все элементы списка. С помощью преобразования в хэш-массив и обратно можно избавляться от одинаковых элементов в списке, т.к. ключи у хэш-массивов не могут быть одинаковыми.
                            ExpandedWrap disabled
                               
                                  @var=('a', 'b', 'a', 2, 'c', 'c', 'd');
                                  %var=@var;
                                  @var=%var;
                               
                                  # теперь в @var содержится что-то вроде ('a', '2', 'c', 'c', 'd', undef), но не именно в том самом порядке, элементы в хэш-массиве хранятся в любом "удобном" для оперирования порядке!


                            Теперь уже традициионное, создание двухмерной матрицы из хэш-массивов:
                            ExpandedWrap disabled
                               
                                  $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'
                                      }
                                  );


                            Список в фигурных скобках - это ссылка на хэш-массив.
                            Как получить доступ к элементам матрицы скажу позже.




                            Это не было трудно, но из таких простых элементов строятся любые струтуры.
                            Чуть-чуть ещё.
                              Как определить IP-адрес клиента?

                              Автор: Mastilior и Budda

                              PHP
                              ExpandedWrap disabled
                                $ip = $_SERVER["HTTP_CLIENT_IP"];
                                if (empty($ip)) $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]);
                                if (empty($ip)) $ip = $_SERVER["REMOTE_ADDR"]);


                              Perl
                              ExpandedWrap disabled
                                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 (серверный!)
                              ExpandedWrap disabled
                                var ip = ssjs_getCGIVariable("REMOTEADDR");
                                write(ip);


                              JavaScript (клиентский)
                              Невозможно! Клиентский JavaScript - это язык скриптов, которые выполняются на машине пользователя.
                              :-р
                                Как записать большой текстовый блок в программу на Perl?

                                ...а потом ещё и прочитать его?


                                Автор: Tishaishii

                                ExpandedWrap disabled
                                  package Текущий_Пакет;
                                  #...............................
                                   
                                  print while <Текущий_Пакет::DATA>;
                                  #или
                                  open DATA, '<&Текущий_Пакет::DATA';
                                  # копирование ссылки на "Текущий_Пакет::DATA" через функцию "open"
                                     print while <DATA>;
                                  close DATA;
                                  #...............................
                                  +1;
                                   
                                  #конец программы
                                  __DATA__
                                  Вот тут можно написать
                                      много всякого-разного и засунуть сюда
                                     огромный текстовый блок
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Закрыто negram 03-12-2010:



                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,3001 ]   [ 16 queries used ]   [ Generated: 23.05.19, 04:57 GMT ]