Архив

Статии по ключова дума: ‘Php’

Piwik не отчита посещенията

29 август, 2010 Няма коментари

Забелязах, че от няколко часа Piwik отчита посещенията само на 2 сайта, а другите стоят на нула посещения. Разгледах по- подробно какво се случва и видях, че третия сайт е голям и рекалкулацията на посещенията му отнема доста ресурси и затова гърмил

Рекалкулиране на посещенията:

sh public_html/misc/cron/archive.sh

Грешка:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4104 bytes) in public_html/core/DataTable.php on line 935

Решение:

Решението е да промените ограничението на използваната памет в php.ini(ще бъде за всички php скриптове) или най- доброто за мен е локално да увеличите обема на предоставената памет. За целта трябва да редактирате файл "public_html/misc/cron/archive.sh"

Ред 60 (Преди):

CMD_TOKEN_AUTH="$PHP_BIN -q $PIWIK_PATH --- module=API&method=UsersManager.getTokenAuth&userLogin=$PIWIK_SUPERUSER&md5Password=$PIWIK_SUPERUSER_MD5_PASSWORD&format=php&serialize=0"
TOKEN_AUTH=`$CMD_TOKEN_AUTH`

Ред 60 (Сега):

CMD_TOKEN_AUTH="$PHP_BIN -d memory_limit=1024M -q $PIWIK_PATH --- module=API&method=UsersManager.getTokenAuth&userLogin=$PIWIK_SUPERUSER&md5Password=$PIWIK_SUPERUSER_MD5_PASSWORD&format=php&serialize=0"
TOKEN_AUTH=`$CMD_TOKEN_AUTH`

Ред 74 (Преди):

CMD="$PHP_BIN -q $PIWIK_PATH --- module=API&method=VisitsSummary.getVisits&idSite=$idsite&period=$period&date=last52&format=xml&token_auth=$TOKEN_AUTH";

Ред 74 (Сега):

CMD="$PHP_BIN -d memory_limit=1024M -q $PIWIK_PATH --- module=API&method=VisitsSummary.getVisits&idSite=$idsite&period=$period&date=last52&format=xml&token_auth=$TOKEN_AUTH";

Decode на unicode cyrillic

Идеята е да се декодира unicode cyrillic със php. Ето един простичък метод:

function unicode_decode($str)                                                                                                               {
return preg_replace("/\\\u([0-9A-F]{4})/ie", "iconv('utf-16', 'utf-8', hex2str(\"$1\"))", $str);
}

function hex2str($hex)
{
$r = ";
for ($i = 0; $i; $r .= chr(hexdec($hex[$i] . $hex[$i + 1])))
return $r;
}

php функция за съкращаване на url

25 март, 2010 2 коментари

Преди ползвах простия метод за съкращаване на URL, чрез http://is.gd или  с PHP изпълнено изглежда така:

$short_url=file_get_contents("http://is.gd/api.php?longurl=".$post_url);

Но забелязах, че във facebook този редирект (is.gd) е репортнат от потребителите за извършени злоутпореби и заради това Facebook не позволяват тези линкове(т.е. позволяват да се добавят в постовете, но не можеш да ги отвориш). За целта реших да премина на друг редиректор които да си работи(btw: този is.gd работи в twitter и edno23, но не и във facebook).
Преминах към http://bit.ly . Направих си регистрация (прави се за секунда) и понеже ше правя ключове от PHP си взех APP ключа от ТУК . След това още от първия сърч видях, че има написана проста функция за съкращане на урл, чрез bit.ly . Ето я и функцията:

function make_bitly_url($url,$login,$appkey,$format = 'xml',$version = '2.0.1')
{
//create the URL
$bitly = 'http://api.bit.ly/shorten?version='.$version.'&longUrl='.urlencode($url).'&login='.$login.'&apiKey='.$appkey.'&format='.$format;

//get the url
//could also use cURL here
$response = file_get_contents($bitly);

//parse depending on desired format
if(strtolower($format) == 'json')
{
$json = @json_decode($response,true);
return $json['results'][$url]['shortUrl'];
}
else //xml
{
$xml = simplexml_load_string($response);
return 'http://bit.ly/'.$xml->results->nodeKeyVal->hash;
}
}//End of function make_bitly_url($url,$login,$appkey,$format = 'xml',$version = '2.0.1')

/* usage */
//$short = make_bitly_url("УРЛ_което_ще_се_съклращава","Потребителско_име","APP ключ","json");
//Примерни реални данни
//$short = make_bitly_url("http://nishto.net","mpetrov_net","R_123ghh7b0db18a42ab1e050e13461551","json");
//echo 'The short URL is:  '.$short;

Хубав ден :)

php грешка: undefined function imagecreatefromgif

14 януари, 2010 1 коментар

Това е публикация за начинаещи web php разработчици :) (web и php , че и разработчик) :)
Пускате готов скрипт които вероятно не сте писали и ви излиза тази грешка:

Fatal error Call to undefined function imagecreatefromgif()

Отговорът на тази грешка е, че няма gd support за обработване на изображения. За целта го инсталираме(в случая deb базирано дистро):
apt-get install php5-gd

След това рестартираме apache:

/etc/init.d/apache2 restart

След това phpinfo() и виждате, че вътре вече има GD. Ето снимка:

Сега вече изпълнявате отново скритпа които даваше грешка и виждате, (че ви излиза друга грешка. Трябва да прочетете повече, шегувам се) че всичко е наред.

Проблеми с preg_replace в php

16 декември, 2009 Няма коментари

Ще бъдат кратък. Когато се ползва preg_replace да се използва преди това изолиране на спец символите:

$string-shit = preg_quote($string, '/');
$string = preg_replace("/^$string_shit/", ", $string);

Идеята е да се избегнат някои грешки като тези:

Warning: preg_replace(): Compilation failed: unmatched parentheses at offset …
Warning: preg_replace(): Compilation failed: missing ) at offset …

Втори вариант:

$last_element=str_replace("/","\/",$last_element);
$last_element=str_replace(")","\)",$last_element);
$last_element=str_replace("(","\(",$last_element);

Как да си счупим Wordpress блога с php таг

23 октомври, 2009 Няма коментари
Днес докато си пишех публикация за таговете <?php и <? ми се случи нещо интересно. Случайно добавих таговете <?php и <? в заглавието на публикацията и заради това се счупи цялата публикация. Ето пример на нормална публикация без "<?php" и със "<?php"
broken_wordpress_with_php_tags_before1

Публикували сме най- нормална публикация

broken_wordpress_with_php_tags_error1

Добавяме тага <?php" в заглавието на публикацията.

broken_wordpress_with_php_tags_after1

Виждаме, че нашата публикация е повредена от преди това добавения таг "

Същото може да се каже и за html тагове които не са затворени правилно. Ето пример:

<div style="display:none"

По- горния таг не е затворен правилно и ще повреди вашият пост.

Изводът е винаги да затваряме всеки един таг.

PS: ако в заглавието добавите <?php echo "martin"; ?> или какъвто и да е код НО СЪС ЗАТОВРЕН таг всичко ще бъде наред(няма да го изведе ) и няма да се счупи поста. Всъщност проблема е само когато добавите само таг за отваряне на php

Компилиране и инсталиране на PHP 5.3 на Debian Lenny

21 октомври, 2009 Няма коментари

Не е необходимо системата да бъде Debian Lenny просто тази в момента е такава(както и да е). Освен, че системата е на Debian Lenny, apache- 2.2 и mysql 5.1 . Преминавам по същество как да инсталираме php  5.3 :) :

Според моите изисквания отностно конфигурацията на PHP споделям следните options:

./configure --prefix=/usr --with-apxs2=/usr/sbin/apxs \
--with-mysql=/usr/local/mysql51/ \
--with-tidy=/usr \
--with-curl=/usr/bin \
--with-curlwrappers \
--with-openssl-dir=/usr \
--with-zlib-dir=/usr \
--with-xpm-dir=/usr \
--with-pdo-mysql=/usr \
--with-xsl=/usr \
--with-ldap \
--with-xmlrpc \
--with-iconv-dir=/usr \
--with-bz2=/usr \
--with-mcrypt=/usr \
--with-gd \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-zlib-dir=/usr \
--with-freetype-dir=/usr \
--with-pear \
--with-imap \
--with-kerberos \
--with-imap-ssl \
--with-libedit \
-enable-exif \
-enable-mbstring \
-enable-calendar \
-enable-zip

При конфигурирането излязоха следните грешки, но хубавото, че това не са грешки, а зависимости които трябва да бъдат спазени. Следващото хубаво нещо е, че по- долу не само ще изброя зависимостите, а и как да бъдат изпълнени правилно:

Проблем: configure: error: xml2-config not found. Please check your libxml2 installation.
Решение: apt-get install libxml2-dev

Проблем: configure: warning: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
Решение: apt-get install re2c

Проблем: configure: error: Please reinstall the BZip2 distribution
Решение: apt-get install libbz2-dev

Проблем: configure: error: Please reinstall the libcurl distribution -- easy.h should be in <curl-dir>/include/curl/
Решение: Инсталиране на Curl от тук

Проблем: configure: error: libjpeg.(a|so) not found.
Решение: apt-get install libjpeg62-dev

Проблем: configure: error: libpng.(a|so) not found.
Решение: apt-get install libpng12-dev

Проблем: configure: error: libXpm.(a|so) not found.
Решение: apt-get install libxpm-dev

Проблем: configure: error: freetype.h not found.
Решение: apt-get install libfreetype6-dev

Проблем: configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.
Решение: apt-get install libc-client-dev

Проблем: configure: error: Cannot find ldap.h
Решение: apt-get install libldap2-dev

Проблем: configure: error: mcrypt.h not found. Please reinstall libmcrypt.
Решение: apt-get install libmcrypt-dev

Проблем: configure: error: edit library required by readline not found
Решение: apt-get install libedit-dev

Проблем: configure: error: SNMP sanity check failed. Please check config.log for more information.
Решение: apt-get install libsnmp-dev

Проблем: configure: error: Cannot find libtidy
Решение: apt-get install libtidy-dev

Проблем: configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution
Решение: apt-get install libxslt1-dev

Проблем: checking for mcrypt support… yes
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
Решение: apt-get install libmcrypt-dev

След това се изпълнява:

make && make install

Препоръчително е да изпълните преди "make install" "make test"

Voila: Thank you for using PHP.

Необходимо е да активирате php5 модула в Apache 2.2 по- следния метод:

a2enmod php5
Enabling module php5.
Run '/etc/init.d/apache2 restart' to activate new configuration!

/etc/init.d/apache2 restart

За малко да забравим да копираме php.ini в неговата директория :)

cp /tmp/php-5.3.0/php.ini-production /usr/lib/php.ini

Сега ще сетнем и подразбираща времева зона:

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone =Europe/Sofia

Идеята е, че ако времевата зона на машината не е сетната правилно и от PHP извикате функция Date() ше ви изведе следната грешка:

Warning: date() [function.date]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Sofia' for 'EEST/3.0/DST' instead in /var/www/test1.php on line 2
2009-10-21

Рестартираме (не reload, а restart !) Apache2 за да влязат новите промени в действие.

Това е всичко. Вече имате последна стабилна версия на PHP 5.3

Други проблеми:

Проблем: Зареждате модула php и всичко се очаква да е наред, но Apache все още не php файловете не се изпълняват.
Решение: Трябва да се добави в конф. файл как да се употребяват *.php файловете /etc/apache2/httpd.conf :

<IfModule mime_module>
AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps

</IfModule>

Проблем: При php.ini с таговете определящи вашия php код.
Решение натиснете ТУК

PS: Много внимавайте при конфигурацията на PHP с използването на -enable , --with . Забележете, че "enable" е с една чертичка отпред, а "with" с две черти. Ако напишете "--enable" (enable с две чертички) то това ще ви донесе неприятности в къщи :)

<IfModule mime_module>
AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps
</IfModule>
Categories: sadmin Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Често срещани проблеми с encoding при php

19 октомври, 2009 2 коментари

Случвало ли ви се е да имате стринг които е написан с cp1251 и които да искате да конвертирате в utf-8. Най- вероятно да, но случвало ли ви се е да имате стринг които е написан или на cp1251 или на utf-8 предполагам, че на доста няма да им се е налагало затова реших да напиша тази публикация за лесното на следващите след мен.
Имаме стринг "Това е текст" но незнаем на какъв енкодинг е. Преди да го конвертираме в utf-8 или cp-1251 първо трябва да знаем какъв е и след това е ясно. Ето разиграно решение:

<?php

$s_utf8=iconv("CP1251","UTF-8","Това е текст- ЮТФ-8");
$s_cp1251="Това е текст- ЦП1251";

$check1=mb_detect_encoding($s_utf8,'UTF-8,CP1251');
$check2=mb_detect_encoding($s_cp1251,'UTF-8,CP1251');

echo "[$s_utf8 <-><b>$check1</b>] -- [$s_cp1251 <-> <b>$check2</b>]";

?>

Ето примерен проблем при конвертиране с iconv:

<?php
iconv("UTF-8","CP1251",$s_cp1251);
iconv("CP-1251","UTF-8",$s_utf8);
?>

В горното казваме, че искаме да конвертираме UTF-8 към cp-1251, но това няма как да се реализира понеже стринга е CP1251. Същата тази грешка се получава и при следващото . Именно поради тази причина преди да се конвертира даден стринг към друг енкодинг трябва да се знае какъв е бил преди и какъв да бъде след.

Ето ви две функции за конвертиране от UTF8 към CP1251 и втората отново за конвертиране на CP1251 към UTF8, но с проверка за текущия входящ стринг. При тези две функции може да конвертирате без наличие на iconv.

function cp1251_to_utf8($s)
{
function detect_encoding($string)
{
static $list = array('utf-8', 'windows-1251');
foreach ($list as $item)
{
$sample = iconv($item, $item, $string);
if (md5($sample) == md5($string))
return $item;
}
return null;
}

if ( (detect_encoding($s)) == "windows-1251")
{
$c209 = chr(209); $c208 = chr(208); $c129 = chr(129);
for($i=0; $i<strlen($s); $i++)
{
$c=ord($s[$i]);
if ($c>=192 and $c<=239) $t.=$c208.chr($c-48);
elseif ($c>239) $t.=$c209.chr($c-112);
elseif ($c==184) $t.=$c209.$c209;
elseif ($c==168)    $t.=$c208.$c129;
else $t.=$s[$i];
}
return $t;
}
else
{
return $s;
}
}//End of function cp1251_to_utf8($s)

function utf8_to_cp1251($s)
{
if ((mb_detect_encoding($s,'UTF-8,CP1251')) == "UTF-8")
{
for ($c=0;$c<strlen($s);$c++)
{
$i=ord($s[$c]);
if ($i<=127) $out.=$s[$c];
if ($byte2)
{
$new_c2=($c1&3)*64+($i&63);
$new_c1=($c1>>2)&5;
$new_i=$new_c1*256+$new_c2;
if ($new_i==1025)
{
$out_i=168;
} else {
if ($new_i==1105)
{
$out_i=184;
} else {
$out_i=$new_i-848;
}
}
$out.=chr($out_i);
$byte2=false;
}
if (($i>>5)==6)
{
$c1=$i;
$byte2=true;
}
}
return $out;
}
else
{
return $s;
}
}

Проблем с phpmyadmin

14 октомври, 2009 Няма коментари

Днес ми репортнаха за един от моите инсталирани phpmyadmin, че извеждал грешка :
PHPMYADMIN The configuration file now needs a secret passphrase (blowfish_secret).

Решението е:

Отваряте файл /var/lib/phpmyadmin/blowfish_secret.inc.php
и се копира този ред където е въведен вашият blowfish. Пример:
$cfg['blowfish_secret'] = 'Примерен hesh81927398akjhasdklfj';

Копираната променлива и хеш записвате в най- долния ред на файла /etc/phpmyadmin/blowfish_secret.inc.php

След това презареждате phpmyadmin от браузъра и всичко е наред. :)

Изпълнение на php в прост html файл

7 октомври, 2009 Няма коментари

Реших да напиша тази публикация понеже доста хора знаят как да пишат и изпълняват php скриптове във *.php файлове и още толкова много хора незнаят как да изпълняват php в статичен html файл.

1. Трябва да направите промени в MIME Конфигурацията, а именно да добавите:

RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html

Може да добавите тези редове във виртуалня хост, в apache2.conf както и в .htaccess

2. Да вмъкнем php в html- Пример:

<html><head><title>Primer za izpylnenie na php w html</title>
</head>
<body>
<i>Red 1 statichen w html</i>
<br>
<b>Red 2 dinamichen ot php</b></body>
</html>

Изпълнението е следното:

Red 1 statichen w html
Red 2 dinamichen ot php