Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Оптимизация PHP кода


Рекомендуемые сообщения

Помогу желающим оптимизировать PHP скрипты/MySQL запросы.

Примечание: Если скрипт использует MySQL базу или же надо оптимизировать MySQL запрос, то прикладывайте к скрипту "SHOW CREATE TABLE" + описание для всех таблиц.

Ссылка на комментарий
Поделиться на другие сайты

Скачал форму отправки сообщений. Две проблемы: 1. При отправке письма в подгружаемой страничке неправильно отображается текст. не правильно выставлена кодировка. 2. Форма вообще не работает :doh: Тоесть пишет что письмо отправлено, но оно не приходит.

Код формы:

<div align="center">	 <table border="0" width="80%" cellspacing="4" cellpadding="0" id="table6" background="diagon_sredn.jpg"><tr><td align="center" background="diagon_svetl.jpg">			<FORM method="POST" action="send.php">			<p>Имя и отчество:<br>		<INPUT type="text" name="Name" size=30>			</p>			<p>Адрес Вашей электронной почты:<br>		<INPUT type="text" name="Email" size=30>			</p>			<p>Текст сообщения:<br>		<textarea name="Message" cols=30 rows=5></textarea>			</p>		<INPUT type="submit" value="Отправить">		  </FORM>		  </td>		  </tr>		  </table></div>

Код страници:

 <?php$info = "Name:\t$Name\n"; $info .= "E-Mail:\t$Email\n"; $info .= "Message:\t$Message\n\n";  $send_to = "aliansd@rambler.ru";	  $subject = "Contact From Site"; $website = "http://www.massagist.kiev.ua";  $headers = "From: My Web Site <> \n"; $headers .= "Reply-To: $email\n\n";  $send = mail($send_to, $subject, $info, $headers); if($send == 1) {   print ("	  <html>	<head>	<meta http-equiv=\"Content-Language\" content=\"ru\">	<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">	<title>Сообщение удачно отправлено</title>	<style>	<!--	body		 { font-family: Verdana; font-size: 10pt }	-->	</style>	</head>	<body>		<p align=\"center\"><font color=\"#008000\"><b>Сообщение удачно отправлено</b></font><br><a target=\"_self\" href=\"index.htm\">На главную</a></p>	</body>"); } else print ("	  <html>	<head>	<meta http-equiv=\"Content-Language\" content=\"ru\">	<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1251\">	<title>Сообщение отправить не удалось</title>	<style>	<!--	body		 { font-family: Verdana; font-size: 10pt }	-->	</style>	</head>	<body>	<p align=\"center\"><font color=\"#FF0000\"><b>Сообщение отправить не удалось</b></font><br><a target=\"_self\" href=\"index.htm\">На главную</a></p>	</body>");?>

Что не так, что нада поменять?

Ссылка на комментарий
Поделиться на другие сайты

Griff: в хидере $headers, пишешь

charset=windows-1251 или любую кодировку, которую надо тебе.

То есть это будет выглядеть так:

$headers = "charset=windows-1251;From: My Web Site <> \n";

Насчет второй проблемы:

скорее всего это ограничения самого сервера, функция mail () просто может не поддерживаться или на неё накладываются ограничения.

Можешь проконсультироваться в службе поддержке своего хостинга и выяснить поддерживается ли функция mail () и не наложены ли на неё какие-либо ограничения.

Изменено пользователем Dimon#ic
Ссылка на комментарий
Поделиться на другие сайты

Нелзя так писать header-ов

$headers = "charset=windows-1251;\r\n From: My Web Site <> \r\n";

Ссылка на комментарий
Поделиться на другие сайты

Если хостер отключил функцию mail(), то могу порекомендовать отличный класс для работы с почтой:

http://phpmailer.sourceforge.net

Правда в упор не понимаю какое отношение вс это имеет к оптимизации - может перенесете посты в тему http://www.softboard.ru/index.php?showtopic=31341 ?

Ссылка на комментарий
Поделиться на другие сайты

В общем то Darhazer - прав, дело в том, что в качестве разделителя лучше использовать \r\n, хотя использование \n не запрещается.

Griff, замени все \n на \r\n так, как этот разделитель понимают все почтовые агенты, \n, лишь не многие

Ссылка на комментарий
Поделиться на другие сайты

За офтоп - извините :) я больше так не буду :doh:

Спасибо всем :) Отправка работает, а вот кодировка не работает... После сохранения все кириличные символы заменяются на "??????". Хотя все поменял и сделал как предлагалось. Мне говорили, что возможно нужно в .htaccess прописать AddDefaultCharset windows-1251. Но проблема в том, что я никогда не менял ничего в данном файле, не знаю его структуру. На хостинге у меня этот файл пустой, тоесть его вес 0 кб. Могу я взять любой другой файл .htaccess и заменить им тот, что у меня на хостинге? Или что лучше сделать? :)

Ссылка на комментарий
Поделиться на другие сайты

Все работает! :doh: Спасибо Dimon#ic, Darhazer, Siberex за помощь! Отдельное спасибо Wandragor, без него ничего бы сам не сделал. Что еще сказать :) ? Мой вопрос решен :)

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

У меня несколько общих вопросов.

1. У меня инклюдом подключен хак, который делает титлы для страниц. Т.е. отдельно делается запрос(ы), который запрашивает названия модуля, каталога и страницы.

Эти же запросы, но более обширные делают сами модули, выводя информацию для разных страниц.

Имеет ли смысл менять код и всталять титлы напрямую из модулей, редактируя функции.

Или же от запроса, чтобы узнать заголовок или название - никакого толка (что есть, что нет - микросекунда разницы).

2. Есть ли разница:

Если запросить в базу выбрать все 10 полей (SELECT *), а использовать только 1 поле.

Или же выбирать надо только то что используется.

3. Стоит ли обьединять простые запросы в сложные.

Например спросить ID категории, а потом по ней из другой таблицы спросить ее описание.

Или же разумнее все сделать одним запросом.

4. Как можно проверить нагрузку, которую делает скрипт или запрос? У меня есть счетчик запросов, время генерации страницы и время обращения в БД, но они на одной страницы колебляться, поэтому сравнивать по ним нельзя. (с таким запросом и с другим запросом).

5. Функции. Можно ли сделать 10 функций (для удобства) каждая из которой будет частью в таблице. Чтобы таблицы строить удобно:

opentab();

titletab();

echo "лялялa";

titletabclose();

opentabclose();

Или же это глупо?

6. Глобал

В глобале стоит много того чего я удалил и то что использовать ненадо. Будет ли толк если удалить из него все ненужное?

---

Пока вроде все, вспомню еще, спросю :bye1:

-----

а вообще хотелось бы предисловие к пункту.... что есть оптимизация, для чего надо, сложно ли сделать.

я бы прочел тут лучше, чем лазить по всему форуму и искать.

Я вот хоть и не опытный, но сервер смогу загрузить, но хочется наоборот... сделать минимум нагрузки.

Про тех, кто ставит порталы и незнает как блок в хтмл сделать из админки - я не говорю.

Я про тех кто хочет, но не читает книг (про себя). С чего надо начать оптимизацию, что надо учитывать и т.д.

Думаю наверняка есть статья и не одна, тогда просто перекопируйте в этот топик, точнее дайте ссылки. И все это в первом посте...

--------

А вообще интересно, Коля такую тему класную предложил, а все нулем, тока пофлудили немного тут.

Изменено пользователем Alexander-V-Sh
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Возникла проблема в использовании mysql запроса.

проблема в том что нужно выбирать данные по значению столбца TIMESTAMP, но набрать в запросе например where datetime>'2006-07-24 02:30:08' где datetime столбец типа TIMESTAMP, не получается, как можно заменить эту операцию?

Ссылка на комментарий
Поделиться на другие сайты

Возникла проблема в использовании mysql запроса.

проблема в том что нужно выбирать данные по значению столбца TIMESTAMP, но набрать в запросе например where datetime>'2006-07-24 02:30:08' где datetime столбец типа TIMESTAMP, не получается, как можно заменить эту операцию?

Оперировать с TIMESTAMP можно например при помощи mktime ().

Например так:

---------------------------------------------

where datetime > '".mktime ()."'

---------------------------------------------

А вообще, бывает удобно написать конвертер UnixTimeStamp в стандартное время обратно.

Изменено пользователем Dimon#ic
Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Alexander-V-Sh:

1. Избегай дублирования кода и запросов. В данном случае лучше вообще пересмотреть структуру сайта. Почему бы В главном скрипте не получить все данные, и не передавать их модулю?

Толк от этого появится когда посетителей будет за 10000 в день...

2. Чем меньше полей выбираешь, тем меньше траффик от сервера MySQL к клиенту (на PHP/Perl).

3. Конечно лучше всё делать одним запросом. Во-первых MySQL оптимизирует сами запросы, во-вторых два запроса - это уже два запроса, а не один...В сумме они выполняются дольше.

4. Прогони в цикле исследуемый участок кода 10000+ раз.

5. Сам способ глупый. Используй шаблоны.

6. Что за глобал?

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

kolya7k:

5 - Сделал как я и писал, ИМХО не глупо. Получился свой шаблон, где можно 1 строчкой поправить красиво таблицы. Причем есть возможность добавить графику вместо стиля. Много функций, но удобнее мне, ибо дизайн на 100% не определен.

6 - Глобал - глобальные переменные.

function replyPreview ($lid, $postname, $subject, $comment, $xanonpost) {global $module_name, $user, $cookie, $anonpost, куча переменных неиспользуемых;код функции.}

Грузят ли эти переменные, если вставляются в глобал.

Но сдесь я вроде все лишнее удалил по всему сайту, хуже точно не будет.

----------

Еще вопрос. Как лучше сделать. Имеется 100-300 сообщений, которые рандомом выводятся. Мне без разницы как это сделать, в коде или MySQL - В базе удобнее добавлять или редактировать. Но если данные в коде меньше едят ресурсов, то так тоже удобно, ибо они на 95% статичны, т.е 1 раз вписались и не трогаются.

В таких случаях как лучше поступать? Вгонять данные в БД и иметь 1 запрос или все встроить в код.

Изменено пользователем Alexander-V-Sh
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Alexander-V-Sh: в базе это решение окажется быстрее.

Почти любая операция с БД выполняется быстрее чем такая же операция но с файлами.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...
SELECT t.`name` tname ,u.`name` author ,p.`date` date ,f.`name` fname ,f.`idf` idf ,t.`idt` idt FROM `forum_themes` t ,`users` u ,`forum_posts` p ,`forum_forums` f WHERE p.`idp`=(SELECT idp FROM forum_posts WHERE idf=f.`idf` ORDER BY time DESC LIMIT 1) AND f.`idf`=t.`idf` AND p.`idu`=u.`idu` AND p.`idt`=t.`idt` GROUP BY f.`idf`;

Помогите плз оптимизировать

Нужно вывести название форумов, название темы которая последний раз обновлялась в данном форуме, ник пользователя который писал последнее сообщение в данной теме и дату этого сообщения. Всё очень просто :)

Структуры таблиц

-- ---------------------------------------------------------- -- Table structure for table `forum_forums`-- CREATE TABLE `forum_forums` ( `idf` int(11) NOT NULL auto_increment, `name` text, `hide` int(11) default NULL, `date` text, `lost_update` int(11) NOT NULL default '0', PRIMARY KEY  (`idf`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=132;-- ---------------------------------------------------------- -- Table structure for table `forum_posts`-- CREATE TABLE `forum_posts` ( `idp` int(11) NOT NULL auto_increment, `idt` int(11) default '0', `idu` int(11) NOT NULL default '0', `idf` int(11) NOT NULL default '0', `name` text, `parent_post` text, `date` text, `hide` int(11) default '0', `time` int(11) NOT NULL default '0', PRIMARY KEY  (`idp`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=144;-- ---------------------------------------------------------- -- Table structure for table `forum_themes`-- CREATE TABLE `forum_themes` ( `idt` int(11) NOT NULL auto_increment, `name` text, `hide` int(11) default '0', `date` text, `idf` int(11) default '0', `author` int(11) default '0', `lost_update` int(11) NOT NULL default '0', PRIMARY KEY  (`idt`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=51;-- ---------------------------------------------------------- -- Table structure for table `users`-- CREATE TABLE `users` ( `idu` int(11) NOT NULL auto_increment, `name` text, `pass` text, `about` text, `sayt` text, `mobile` text, `mail` text NOT NULL, `status` int(11) NOT NULL default '0', PRIMARY KEY  (`idu`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15;
Ссылка на комментарий
Поделиться на другие сайты

  • 4 месяца спустя...

Всем привет!

Решил сделать форму обратной связи и столкнулся с проблемкой одной. Как сделать чтобы при выборе например "Через поисковую систему и Визитка" это приходило на мой e-mail. С другим полями (Контактное лицо, организация и т.д.) я уже разобрался. Осталось только разобраться с "Как с Вами связаться и Как Вы узнали о нас?".

Помогите пожалуйста очень прошу.

Заранее спасибо.

Если нужен год то вот:

<?phperror_reporting(0);require("./config.inc");require("./fead.inc");# Функции function formtohtml ($str) {if (get_magic_quotes_gpc()) {$str = stripslashes($str);} $str = trim($str); $str = htmlspecialchars ($str, ENT_QUOTES); $str = str_replace("|", "/", $str); $str = str_replace("\r", "", $str); $str = str_replace("\n", "<br>", $str); $str = eregi_replace("(<br>*){2,}","<br><br>",$str); $str = eregi_replace("[ ]{2,}", " ", $str); return $str; } function htmltoform ($str) { $str = str_replace("&", "&", $str); $str = str_replace(""", "\"", $str); $str = str_replace("'", "'", $str); $str = str_replace("<", "<", $str); $str = str_replace(">", ">", $str); $str = str_replace("<br>", "\r\n", $str); return $str; }# Отправка if (!empty($_GET['a']) and $_GET['a'] == "m") { $var['fields'] = array("name"=>"Контактное лицо", "email"=>"E-Mail", "subject"=>"Тема", "message"=>"Сообщение"); $notice['error'] = array();foreach ($var['fields'] as $key => $value) {if (empty($_POST[$key]) || (($_POST[$key] = formtohtml($_POST[$key])) == "0")) $notice['error'][] = $value;}if (empty($notice['error'])) {  if (preg_match("/^([a-z,0-9,_,\-,\.])+\@([a-z,0-9,_,\-])+(\.([a-z,0-9])+)+$/",$_POST['email'])) {  $t['c'] = file($config['recip_f']);  $t['n'] = sizeof($t['c']);	for ($i=0;$i<$t['n'];$i++) {	$t['c'][$i] = explode("|",trim($t['c'][$i]));	}	if (!empty($_POST['recip']) and !empty($t['c'][$_POST['recip']-1])) {	$var['recip_n'] = $t['c'][$_POST['recip']-1][1];	$var['recip_e'] = $t['c'][$_POST['recip']-1][0];	  if (function_exists("imap_binary")) {		function mail_convert($str) {		$str = trim(imap_binary(addcslashes($str, "\"!@\\!@(!@)")));		return $str;		}	  $var['subj'] = "=?Windows-1251?B?".trim(imap_binary(htmltoform($_POST['subject'])))."?=";	  $var['header']  = "From: =?Windows-1251?B?".mail_convert(htmltoform($_POST['name']))."?= <".$_POST['email'].">\r\n";	  $var['header'] .= "MIME-Version: 1.0\r\n";	  $var['header'] .= "Content-Transfer-Encoding: 8bit\r\n";	  $var['header'] .= "Content-Type: text/plain; charset=\"Windows-1251\"\r\n";	  $var['header'] .= "X-Mailer: PHP v.".phpversion();	  $var['message']  = htmltoform($_POST['message']);	  if (!empty($config['features'])) $var['message'] .= "\r\n\r\n Организация: $org \rДолжность: $dol \rТелефон: $tel \r# Ниже Как связаться и как узнали о нас, не работают =((( Как связаться: $teoemaio \r Как узнали о нас: $sea $mag $znak $nar $viz $dr \r\n ---------------------------------------\r\nIP адрес отправителя: ".$_SERVER['REMOTE_ADDR'];	  # Пытаемся послать сообщение		if (mail("=?Windows-1251?B?".mail_convert(htmltoform($var['recip_n']))."?= <".$var['recip_e'].">",$var['subj'],$var['message'],$var['header'])) {		$notice['ok'] = "Сообщение успешно отправлено";		}		else {		$notice['error'] = "Системная ошибка - сбой функции "mail"";		}	  }	  else {	  $notice['error'] = "Ошибка программы - недоступна функция "imap_binary"";	  }	}	else {	$notice['error'] = "Ошибка настоек программы - неверный получатель";	}  }  else {  $notice['error'] = "Пожалуйста, проверьте правильность e-mail";  }}else {$notice['error'] = "Пожалуйста, заполните поля: ".implode(", ",$notice['error']);} }echo "<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\">\r\n"; if (empty($notice['ok'])) { echo "<form name=\"SM\" method=\"POST\" action=\"".$_SERVER['PHP_SELF']."?a=m\">\r\n"; } else { // ПРИ ВОЗНИКНОВЕНИИ ОШИБКИ "METHOD POST NOT ALLOWED" ИЗМЕНИТЬ "POST" на "GET" echo "<form name=\"GT\" method=\"GET\" action=\"".$config['url_path']."\">\r\n"; }# Сообщение о завершении / ошибке if (!empty($notice)) { echo "<tr><td align=\"center\">";if (!empty($notice['ok'])) {echo "<p><b><font color=\"#008000\">".$notice['ok']."!</font></b></p>";}elseif (!empty($notice['error'])) {echo "<p><b><font color=\"#800000\">".$notice['error']."!</font></b></p>";} echo "</td></tr>\r\n"; }# Вывод формы if (empty($notice['ok'])) { echo "<tr><td align=\"center\">"; require("./form.inc"); echo "</td></tr>\r\n"; }echo "<tr><td align=\"center\"><table border=\"0\" cellpadding=\"5\" cellspacing=\"0\"><tr><td>";# Кнопки if (empty($notice['ok'])) { echo "<input type=\"submit\" value=\"Отправить\"></td>\r\n"; echo "<td><input type=\"reset\" value=\"Сбросить\">\r\n"; } else { echo "<input type=\"submit\" value=\"".$config['url_name']."\">\r\n"; }echo "</td></tr></table></td></tr>\r\n";# Футерrequire("./joop.inc");?>
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

У меня такой вопрос: что означает данное выражение? (я в курсе что это ошибка пхп)

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /www/sites/sait.ru/engine/inc/editusers.php on line 781

Может есть список всех ошибок пхп...

Изменено пользователем verba
Ссылка на комментарий
Поделиться на другие сайты

  • 8 месяцев спустя...

все уже нормально, получилось, исправил... :weight_lift2:

расскажи, плиз в чем прикол! А то у меня та же прблема. Хотел организовать отправку инфы из формы на сайте...

Выдает ошибку:

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/kach/public_html/email.php on line 155

Что самое интересное, 155-ой строки нет вообще в этом файле... Их там всего 110, если верить AkelPad :)...

<?php if(mail("sales@elit-dveri.com.ua", $_POST['Subject'], $_POST['Body']."\n".$_POST['Sender'], "From: $_POST['MailFrom']"))

{ print("Письмо успешно отправлено!");}

else{ print("Произошла ошибка!");} ?>

ребят, помогите, плиз! объясните чайнику! Или дайте пример кода, который нужно разместить, чтоб можно было банально письма отправлять через форму с сайта. Сервак, на котором размещен сайт, поддурживает PHP5, PHP4.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Здравствуйте,

Есть простой сприпт написанные на Javascript, надо переделать его в рнр

<script language="JavaScript">

<!--

var i = 0;

var Sites = Array("http://yandex.ru","http://rambler.ru");

function lframe()

{

parent.bottomFrame.location=Sites;

document.all.cnt.value=i;

i++;

}

setInterval("lframe()","10000");

//-->

</SCRIPT>

...

Это возможно?:) :blush2: ..

PS: скрипт редиректит посетителя на другу страницу. каждые 10 секунд....

Ссылка на комментарий
Поделиться на другие сайты

  • 5 месяцев спустя...

Я использую для написания кода PHP программу phpDesigner - думаю самая лучшая программа для написания собственных скриптов. И подсветка синтаксиса и начинаешь писать функцию - а программа уже выдает список функций, которые поддерживаются языком. Выделяет функции в скрипте. Можно отлаживать скрипт. В общем все, что нужно для написания скрипта.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Anton62: php работает на стороне сервера JavaScript на стороне клиента

редирект на php сделать можно, но не через 10 секунд, а перед загрузкой страницы

делается так:

<?phpheader("Location: http://www.redirectsite.ru/");exit;?>
Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...