Архивы для категирии - ‘Php’

Расчет дистанции между объектами

Приведу пару примеров расчета расстояния между объектами по заданным координатам

SELECT * ,  ( 3959 * acos( cos( radians(47) ) * cos( radians( latitude ) ) * cos( radians( longitude ) – radians( 35 ) ) + sin( radians( 47 ) ) * sin( radians( latitude ) ) ) ) AS distance  FROM sometable ORDER BY distance

Данный запрос возвращает все строки в таблице отсортированные  в порядке удаления от точки с заданными координатами. (далее…)

Создание xls на php (без установки PEAR)

php_writeexcel является аналогом библиотеки PEAR:: Spreadsheet_Excel_Writer
 - Perl пакет для PHP. Это позволяет создавать документы Microsoft Excel на PHP без установки на сервер каких-либо дополнительных инструментов. Просто загружаете файлы и вперед…….. создавать xls

Работа с библиотекой сводится к простым вызовам функций. К сожалению даннай аналог не имеет документации.  Поэтому прийдется осваивать самому.

xls-writer вы найдете здесь http://www.bettina-attack.de/jonny/view.php/projects/php_writeexcel/, там же и несколько примеров о том  как создавать xls на php.

Это лучший скрипт для создания xls на php в своем роде.

Вот несколько особенностей (но данными не ограничивается)

  • Поддержка вставки картинок
  • Стили ячеек, шрифтов 
  • Работа с большими файлами
  • Работа со страницами

И самое главное данный xls-writer очень пригоден для работы в паре с xls-reader. Смотри статью Чтение xls на php

Чтение xls на php

Если вам необходимо читать файлы Excel (.xls) средствами PHP, то библиотека PHP-ExcelReader создана специально для вас. Для работы необходима поддержка или mbstring. Вот пример того, как можно оформить вывод xls-документа в HTML-таблицу с использованием этой библиотеки.

Для работы с кириллицей нужно изменить кодировку UTF8 (по умолчанию) на CP1251 в файле excell_reader2.php: var $_defaultEncoding = «CP1251″
Данная библиотека протестированна и работает почти на 100%. Единственная проблема это использование функции dump(), она не отображает кириллицу. Однако если использовать просто массивы возвращаемые данной библиотекой то данное решение можно считать окончательным.

В последней версии xls-reader есть поддержка шрифтов, размеров столбцов и строк, цвета ячеек, границы, заливка и многое другое

http://code.google.com/p/php-excel-reader/ по данной ссылку вы найдете страницу разработчика xls-reader и сможете скачать последнюю вернсию.

От себя скажу, что это самая лучшая реализация чтения excel на php из всех тех, что я находил в сети.

Оптимизация сценариев на php

Оптимизация
«Преждевременная оптимизация – корень всех зол».
Дональд Кнут «Искусство программирования»
данная статья взята из книги «Профессиональное программирование на PHP, авторы LArgerich, W.Choi, J.Coggeshall, и другие

Иногда, написав приложение веб-сайта на РНР, разработчики обнаруживают, что это приложение работает недостаточно быстро. Поэтому приходится оптимизировать код, чтобы сократить время выполнения сценариев. Несмотря нато что РНР, в целом, быстрый язык выполнения сценариев, существует ряд
технологий, рекомендаций и приемов, позволяющих оптимизировать код.

Выбор правильного языка
Первый вопрос, который возникает, когда производительность приложения оказывается неудовлетворительной, — это правильно ли выбран язык программирования. Возможно, медлительность обусловлена интерпретатором языка, и тогда нет смысла оптимизировать код – лучших результатов это не даст. Проводилось тестирование нескольких языков программирования, чтобысравнить их быстродействие с РНР. Измерения проводились по многим различным типам сценариев, включающих различные операции; результаты представляют собой усреднение величин, полученных во всех тестах.
Тестировались следующие языки:
• Сценарии CGI Perl
Обычный способ написания кода для веб-сайтов и приложений 1-2 года назад
Выбор правильного языка 913
• Сценарии FastCGI Perl
Механизм повышения производительности сценариев CGI
• Сценарии Python CGI
Использование Python для написания сценариев CGI
• Сценарии mod_python Python
Модуль Apache, позволяющий ему выполнять код Python, не обращаясь
к интерпретатору Python
• Сценарии С CGI
Компилированные сценарии С, выполняющиеся как программы CGI
• Сценарии mod_perl Perl
Модуль Apache, позволяющий выполнять сценарии Perl без вызова интерпретатора Perl
• PHP
Для сравнения те же сценарии программировались на РНР и выполнялись. После нескольких оценок производительности, включающих различные типы сценариев и загрузки серверов, был сделан вывод, что mod_perl, FastCGi и РНР дают самые быстрые результаты, мало различаясь между собой. Таким образом, если сайт или сценарий РНР работают медленно, то надо анализировать код, а не менять язык.

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

Говоря о задачах предварительной оптимизации (preoptimization), программисты рассуждают так: «Я заменю этот вектор хеш-таблицей и повышу скорость» или «Я заменю эту функцию ereg() несколькими функциями str_rep1асе(), это, повысит скорость». Они весьма заблуждаются. Во-первых, при такого рода оптимизации время выполнения сценария
обычно сокращается не более чем на 0,01 секунды, а потому польза невелика, зато легкость чтения кода может значительно пострадать. Во-вторых, предварительная оптимизация очень часто является непроизводительной тратой драгоценного времени программиста. Оптимизацией стоит заниматься, только убедившись в действительной ее необходимости. Профессиональным подходом к повышению производительности будет следующий:
• Профилировать код и найти узкие места
• Классифицировать узкие места
• Ликвидировать узкие места, оптимизировав код

Профилирование кода

Если скорость выполнения кода неудовлетворительна, то первым делом необходимо его профилировать и измерить время, которое сценарий тратит на выполнение различных задач и функций. На основе этой информации можно выяснить, на что сценарий расходует больше всего времени. Эти функции называются узкими местами (bottlenecks). Профилирование может преподнести сюрпризы. Например, может оказаться, что 99% времени сценарий тратит на запросы к базе данных, либо выявятся другие узкие места, такие как дисковый ввод/вывод при чтении больших файлов или журналов. Оптимизация не может быть эффективной без предварительного профилирования. Для того чтобы профилировать сценарий РНР, надо снабдить таймерами некоторые функции и задачи сценария и измерить продолжительность их выполнения.

Классификация узких мест


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

Техника оптимизации
Рассмотрим теперь различные способы оптимизации времени выполнения сценария в зависимости от происхождения узкого места:
• Оптимизация кода
Можно оптимизировать время выполнения интенсивных вычислений (плохо построенные циклы for() или while() или просто медленные команды).
• Буферизация и сжатие вывода
Этот прием полезен, если фактором замедления является сложность вывода в броузер, когда выводимо содержимое генерируется множеством функций.
• Оптимизация базы данных
Применяется, когда замедление обусловлено выполнением запросов к базе данных или интенсивным использованием соединений и функций баз данных.
• Кэширование
Применяется, когда замедление обусловлено временем генерации страницы, которое не может быть сокращено, либо запросы к базе данных невозможно оптимизировать. Другим основанием для кэширования может быть частое обращение к относительно статичным данным.

Продолжение следует…

Pagination class (нумерация страниц на php)

<?php
class pagination
{
var $page = 1; // Current Page
var $perPage = 10; // Items on each page, defaulted to 10
var $showFirstAndLast = true; // if you would like the first and last page options.
function generate($array, $perPage = 10)
{
// Assign the items per page variable
 
if (!empty($perPage))
 
$this->perPage = $perPage;
 
// Assign the page variable
 
if (!empty($_GET['page'])) {
 
$this->page = $_GET['page']; // using the get method
 
} else {
 
$this->page = 1; // if we don't have a page number then assume we are on the first page
 
}
 
// Take the length of the array
 
$this->length = count($array);
 
// Get the number of pages
 
$this->pages = ceil($this->length / $this->perPage);
 
// Calculate the starting point
 
$this->start = ceil(($this->page - 1) * $this->perPage);
 
// Return the part of the array we have requested
 
return array_slice($array, $this->start, $this->perPage);
 
}
 
function links()
 
{
 
// Initiate the links array
 
$plinks = array();
 
$links = array();
 
$slinks = array();
 
// Concatenate the get variables to add to the page numbering string
 
if (count($_GET)) {
 
$queryURL = '';
 
foreach ($_GET as $key => $value) {
 
if ($key != 'page') {
 
$queryURL .= '&amp;'.$key.'='.$value;
 
}
 
}
 
}
 
// If we have more then one pages
 
if (($this->pages) > 1)
 
{
 
// Assign the 'previous page' link into the array if we are not on the first page
 
if ($this->page != 1) {
 
if ($this->showFirstAndLast) {
 
$plinks[] = ' <a href="?page=1'.$queryURL.'">&amp;laquo;&amp;laquo; First </a> ';
 
}
 
$plinks[] = ' <a href="?page='.($this->page - 1).$queryURL.'">&amp;laquo; Prev</a> ';
 
}
 
if(($this->page-5)<=0&amp;&amp;($this->pages + 1)>10)
 
{
 
$start=1;
 
$end=11;
 
}
 
elseif(($this->page-5)<=0&amp;&amp;($this->pages + 1)<=10)
 
{
 
$start=1;
 
$end=$this->pages + 1;
 
}
 
elseif(($this->page-5)>0&amp;&amp;($this->pages + 1)<=10)
 
{
 
$start=1;
 
$end=$this->pages + 1;
 
}
 
elseif(($this->page-5)>0&amp;&amp;($this->pages + 1)>10)
 
{
 
if(($this->page+5)>=($this->pages))
 
{
 
$start=$this->pages-10;
 
$end=$this->pages+1;
 
}
 
else
 
{
 
$start=$this->page-4;
 
$end=$this->page+6;
 
}
 
}
 
// Assign all the page numbers &amp; links to the array
 
for ($j=$start; $j < $end; $j++) {
 
if ($this->page == $j) {
 
$links[] = ' <a class="selected">'.$j.'</a> '; // If we are on the same page as the current item
 
} else {
 
$links[] = ' <a href="?page='.$j.$queryURL.'">'.$j.'</a> '; // add the link to the array
 
}
 
}
 
// Assign the 'next page' if we are not on the last page
 
if ($this->page < $this->pages) {
 
$slinks[] = ' <a href="?page='.($this->page + 1).$queryURL.'"> Next &amp;raquo; </a> ';
 
if ($this->showFirstAndLast) {
 
$slinks[] = ' <a href="?page='.($this->pages).$queryURL.'"> Last &amp;raquo;&amp;raquo; </a> ';
 
}
 
}
 
// Push the array into a string using any some glue
 
return implode(' ', $plinks).implode($this->implodeBy, $links).implode(' ', $slinks);
 
}
 
return;
 
}
 
}
 
?>

Вы просматриваете архивы для Php категории.