레이블이 php인 게시물을 표시합니다. 모든 게시물 표시
레이블이 php인 게시물을 표시합니다. 모든 게시물 표시

2010. 10. 13.

[PHP] how to install memcached on Windows XP

1. memcahced 를 Download 한다.


2. memcached 를  install 한다.

c:\memcached 에 압축을 풀고 command line(cmd)으로 간다.

c:\> cd c:\memcached
c:\> memcached.exe -d install
c:\> memcached.exe -d start
c:\> netstat -a
.
.
TCP     junp:11211     junp:0     LISTENING
.
.

3. php extension을 Download 한다. pecl-5.2.6-Win32.zip
압축풀면 php_memcache.dll 이 있으므로 extension_dir 에 복사를 하고
php.ini에 extension=php_memcache.dll 을 추가한다.


2010. 10. 12.

[PHP] 정규식으로 한글 영어 숫자 추출하기

$pattern = '/([\xEA-\xED][\x80-\xBF]{2}|[a-zA-Z0-9])+/';
$str = 'abc!@하나둘셋#123';
echo $str;
preg_match_all($pattern, $str, $match);
$str = implode('', $match[0]);
echo $str;
==================
abc!@하나둘셋#123
abc하나둘셋123

한글과 영어 숫자를 제외한 나머지문자는 무시하게 된다.




2010. 10. 11.

[CentOS] php에서 memcache 설치하기

# wget http://pecl.php.net/get/memcache-2.2.4.tgz
# tar xzfv memcache-2.2.4.tgz
# cd memcache-2.2.4
# phpize
# ./configure --enable-memcache
# make
# cp modules/*.* /usr/lib64/extensions/no-debug-non-zts-20060613/
# vi /usr/local/apache/conf/php.ini

extension=memcache.so

mongo 설치하는거때문에 신경 많이 쓰였는데 의외로 쉽게 설치가 되었군요.

2010. 10. 8.

[CentOS] php version update 5.1 to 5.2

1. 현재 설치된 버전 확인
# rpm -qa |grep php
 php-common-5.1.6-15.el5.i386
 php-cli-5.1.6-15.el5.i386
 php-5.1.6-15.el5.i386
 php-pdo-5.1.6-15.el5.i386
 php-bcmath-5.1.6-15.el5.i386
 php-ldap-5.1.6-15.el5.i386
 php-devel-5.1.6-15.el5.i386
 php-gd-5.1.6-15.el5.i386
 php-xml-5.1.6-15.el5.i386
 php-mbstring-5.1.6-15.el5.i386
 php-mysql-5.1.6-15.el5.i386
 php-dba-5.1.6-15.el5.i386
2. update 하기 위해 파일 생성
# vi /etc/yum.repos.d/CentOS-Testing.repo
--------------------------------------------------------------------------
# CentOS-Testing:
# !!!! CAUTION !!!!
# This repository is a proving grounds for packages on their way to CentOSPlus and CentOS Extras.
# They may or may not replace core CentOS packages, and are not guaranteed to function properly.
# These packages build and install, but are waiting for feedback from testers as to
# functionality and stability. Packages in this repository will come and go during the
# development period, so it should not be left enabled or used on production systems without due
# consideration.
[c5-testing]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/$releasever/testing/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing
includepkgs=php*
--------------------------------------------------------------------------
3. 업데이트 하기
 # rpm -qa |grep php
 # yum update
 # service httpd restart


[CentOS] mysqli 설치

CentOS 64bit, php-5.2.5에서 mysqli를 설치해봤다.
apm 설치할때 보니까 mysqli가 빠져있길래 추가로 설치를 해봤다.
예전에는 애좀 먹었는데 간만에 하니까 술술 잘되는구나

# cd /usr/local/src/apm/php-5.2.5/ext/mysqli
# phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --with-mysqli=/usr/local/mysql/bin/mysql_config
# make

# mkdir -p /usr/lib64/extension/no-debug-non-zts-20060613
# cp modules/*.* /usr/lib64/extension/no-debug-non-zts-20060613/
# vi /usr/local/apache/conf/php.ini

extension_dir = "/usr/lib64/extensions/no-debug-non-zts-20060613/"
.
.
.
extension=mysqli.so

# /etc/init.d/http restart


2010. 8. 17.

[PHP] MongoDB 사용하기

<?php
$mongoDB = new Mongo();
$newDB = $mongoDB->newDB;
$newCollection = $newDB->newCollection;

$doc = array('name' => 'owner', 'text' => 'this is test');
$newCollection->insert($doc);

$mongoDB->close();
?>

쉘에 들어가서 다음을 입력하면 확인가능하다.
>db.newCollection.find()

2010. 8. 16.

[MongoDB] APM에서 시작하기

1. mongoDB 설치하기

2. 압축풀기
   본인은 C:\MongoDB 에 풀었다.

3. data 폴더 생성하기 (DB data를 위해 생성함)
   본인은 C:\MongoDB\data 에 생성함

4. MongoDB 시작
   
C:\MongoDB\bin> mongod --dbpath C:\MongoDB\data


5. php에서 쓸 MongoDB 드라이버설치
   다른버전 찾기 -> 여기

6. 압축풀고 PHP의 extension 폴더에 dll 파일을 넣음
   C:\APM_Setup\Server\PHP5\ext 폴더가 extension 폴더임
   (본인은 APM_Setup에 APM을 설치함)

7. php.ini에서 해당 모듈을 적용함
   php.ini에 보면 extension정보가 쭉 나열되어 있는 곳이 있음
   거기에 밑의 한줄을 추가해줌
   이왕이면 알파벳 순서에 맞게 하는게 나중에 찾기 편할 듯
 
extension=php_mongo.dll

8. 아파치 재시작
   APMSETUP Monitor를 열어서 Apache를 재시작한다.

9. 확인하기
   echo phpinfo(); 를 이용해서 불러온 정보에 mongo 관련 설정이 있는지 확인한다.
   설치 끝!


[테스트하기] - 반드시 "4번.몽고DB실행"을 한 뒤에 작업해야함.

<?php
$m = new Mongo();
?>


MongoDB를 실행하지 않으면 다음과 같은 에러를 볼 수 있다.

Fatal error: Uncaught exception 'MongoConnectionException' with message ': Unknown error' in C:\APM_Setup\htdocs\mongoDB_tester\index.php:4 Stack trace: #0 C:\APM_Setup\htdocs\mongoDB_tester\index.php(4): Mongo->__construct() #1 {main} thrown in C:\APM_Setup\htdocs\mongoDB_tester\index.php on line 4
 

[참고 사이트]


2010. 7. 19.

FirePHP 사용법

require_once './library/FirePHP.class.php';
$firephp = FirePHP::getInstance(true);
$firephp->log($variable);

FirePHP 사용법.


post raw data

file_get_contents("php://input");

POST 방식으로 보낸 http 패킷의 body에 접근할 수 있다.

일반적으로 PHP에서는 form방식 전송을 이용하는 경우가 대부분이지만

body에 JSON으로 만든 raw data를 넣어서 보내는 경우에 서버단에서 접근하려면

위와 같은 명령어를 이용해야 한다.

2010. 7. 1.

PHP 이미지 crop

<iframe name="cropFrame" width="60" height="50" scrolling="no" style="display:none;"></iframe>
<form action="crop.php" method="post" target="cropFrame">
    <input id="imageSrc" type="hidden" name="imageSrc" value="" />
    <input id="x" type="hidden" name="x" value="0" />
    <input id="y" type="hidden" name="y" value="0" />
    <input id="w" type="hidden" name="w" value="450" />
    <input id="h" type="hidden" name="h" value="200" />
    <input type="submit" value="crop" />
</form>

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

<?php
    require_once './FirePHPCore/FirePHP.class.php';
    $firephp = FirePHP::getInstance(true);

    //$firephp->log($_POST['imageSrc']);
    
    $imageSrc = $_POST['imageSrc'];
    $x = $_POST['x'];
    $y = $_POST['y'];
    $w = $_POST['w'];  // 높이
    $h = $_POST['h'];   // 길이

    $target_w = 450;
    $target_h = 200;
    $jpeg_quality = 90;
    $src = substr($imageSrc, 2);
    $img_r = imagecreatefromjpeg($src);
    $dst_r = ImageCreateTrueColor($w, $h);

    imagecopyresampled(
        $dst_r,
        $img_r,
        0, 0, $x, $y,
        $target_w, $target_h, $w, $h
    );

    $output_filename = './pic/test.jpg';

    header('Content-type: image/jpeg');
    imagejpeg($dst_r, $output_filename, $jpeg_quality);
?>

imagecreatefromjpeg($src);
 - 해당 경로의 파일을 jpeg 이미지로 생성함

ImageCreateTrueColor($w, $h);
 - 파라미터로 받은 넓이와 높이의 크기만한 검정색 이미지를 생성함

imagecopyresampled(
    $dst_r, // 타겟 이미지
    $img_r,  // 복사할 이미지
    0,         // 타겟 이미지의 x좌표
    0,         // 타겟 이미지의 y좌표
    $x,       // 원본 이미지의 x좌표
    $y,       // 원본 이미지의 y좌표
    $target_w, // 타겟 이미지의 넓이
    $target_h,  // 타겟 이미지의 높이
    $w,      // 원본 이미지의 넓이
    $h        // 원본 이미지의 높이
);
 - 이미지의 크기를 변경해서 복사함
 - 이미지의 x, y 좌표는 좌상단 모서리에서 시작함

PHP 파일업로드

<iframe name="uploadFrame" width="60" height="50" scrolling="no" style="display:none;"></iframe>
<form action="upload.php" method="post" enctype="multipart/form-data" target="uploadFrame"/>
    <input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
    <label for="userfile">Upload a file:</label>
    <input type="file" name="userfile" id="userfile" />
    <input type="submit" value="Send File" />
</form>

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

<?php
file_exists($filepath);
 - 파일경로를 파라미터로 넘겨주고 존재 여부를 Boolean으로 받음

 move_uploaded_file($_FILES['userfile']['tmp_name'], $path);
 - 파일을 해당 경로에 업로드함
?>



2010. 5. 8.

성공적인 웹 프로그래밍 PHP와 MySQL


지식발전소!!! [강컴]

이미지출처 : kangcom.com

PHP로 프로그래밍을 하면서 거의 레퍼런스에만 의존해서 프로젝트를 진행했었다. 이 책을 읽음으로써 미쳐 짚고 넘어가지 못했던 부분을 알게 되었고, 다시금 초심으로 돌아갈 수 있었다.

그동안 몇권의 책을 접해봤고 대부분 소스코드가 몇페이지나 연속으로 난무하는 보기 싫은 경우가 많았는데 다행히도 이 책은 그렇지 않았다. 물론 후반부에 어느정도 나오긴 하지만 그 정도는 괜찮다.

레퍼런스에만 의존해서 프로그래밍을 했던 사람들에게는 초심으로 돌아갈 수 있는 이 책이 괜찮다고 생각한다.

2010. 4. 22.

[Code Igniter] layout 적용하기

http://codeigniter.com/wiki/layout_library/ 에서 Layout Library를 구하고 사용법을 확인할 수 있다.

1. /application/libraries/Layout.php 에 다음 소스를 저장한다.
<?php  
if (!defined('BASEPATH')) exit('No direct script access allowed');
 
class Layout
{
 
var $obj;
var $layout;
 
function Layout($layout = "layout_main")
{
$this->obj =& get_instance();
$this->layout = $layout;
}
 
function setLayout($layout)
{
$this->layout = $layout;
}
 
function view($view, $data=null, $return=false)
{
$loadedData = array();
$loadedData['content_for_layout'] = $this->obj->load->view($view,$data,true);
 
if($return)
{
$output = $this->obj->load->view($this->layout, $loadedData, true);
return $output;
}
else
{
$this->obj->load->view($this->layout, $loadedData, false);
}
}
}
?
2. /application/controllers/intro.php (임의로 만든 파일) 의 생성자에 다음 코드를 넣는다.
<?php

class
Intro extends Controller {

function __construct()
{
parent::Controller();

$this->load->library('layout', 'layouts/default');
$this->layout->setLayout('layouts/default');
}
function index()
{
$this->layout->view('layouts/default');
}
}

3. /application/views/layouts/default.php 에 다음 코드를 넣는다.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko" lang="ko" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CI 레이아웃</title>
<style type="text/css">
.header {
width: 760px;
height: 50px;
border: 1px solid #CCCCCC;
}
.navigation {
float: left;
}
.navigation li {
float: left;
margin-right: 10px;
list-style: none;
cursor: pointer;
}
</style>
</head>
<body>
<div class="header">
<ul class="navigation">
<li id="home">Home</li>
<li id="send">Send</li>
</ul>
</div>
</body>
</html>

2010. 3. 25.

PHP 시간함수( strtotime, time(), date() )

echo strtotime("now"); -> 1269520600

echo strtotime("+1 hour"); -> 1269524200

echo time(); -> 1269520600

위의 결과는 모두 timestamp 형태이다.

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

echo date( 'Y-m-d H:i:s', time() );
-> 2010-03-25 21:36:40

위의 결과는 string 형태이다.

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

$timeString = date( 'Y-m-d H:i:s', time() );

echo $timeString; -> 2010-03-25 21:44:32

$time = strtotime($timeString);

echo $time; -> 1269520600

date()와 strtotime() 만 있으면 시간을 string과 timestamp로
자유롭게 바꿀 수 있다.

2010. 3. 10.

PHP에서 OAuth 사용하기

http://wiki.opensocial.org/index.php?title=Validating_Signed_Requests
여기보면 OAuth 사용법이 상세히 나와있고,
내가 자주쓰는 PHP와 요즘 관심이 가는 JAVA 코드를 상세히 봤다.

잠시 PHP 코드를 소개하면 이렇게 되어있다.
--------------------- Source Code ------------------------

<?php

require_once("OAuth.php");
 
class OrkutSignatureMethod extends OAuthSignatureMethod_RSA_SHA1 {
protected function fetch_public_cert(&$request) {
return <<<EOD
-----BEGIN CERTIFICATE-----
MIIDHDCCAoWgAwIBAgIJAMbTCksqLiWeMA0GCSqGSIb3DQEBBQUAMGgxCzAJBgNV
BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIG
A1UEChMLR29vZ2xlIEluYy4xDjAMBgNVBAsTBU9ya3V0MQ4wDAYDVQQDEwVscnlh
bjAeFw0wODAxMDgxOTE1MjdaFw0wOTAxMDcxOTE1MjdaMGgxCzAJBgNVBAYTAlVT
MQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChML
R29vZ2xlIEluYy4xDjAMBgNVBAsTBU9ya3V0MQ4wDAYDVQQDEwVscnlhbjCBnzAN
BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAseBXZ4NDhm24nX3sJRiZJhvy9eDZX12G
j4HWAMmhAcnm2iBgYpAigwhVHtOs+ZIUIdzQHvHeNd0ydc1Jg8e+C+Mlzo38OvaG
D3qwvzJ0LNn7L80c0XVrvEALdD9zrO+0XSZpTK9PJrl2W59lZlJFUk3pV+jFR8NY
eB/fto7AVtECAwEAAaOBzTCByjAdBgNVHQ4EFgQUv7TZGZaI+FifzjpTVjtPHSvb
XqUwgZoGA1UdIwSBkjCBj4AUv7TZGZaI+FifzjpTVjtPHSvbXqWhbKRqMGgxCzAJ
BgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEU
MBIGA1UEChMLR29vZ2xlIEluYy4xDjAMBgNVBAsTBU9ya3V0MQ4wDAYDVQQDEwVs
cnlhboIJAMbTCksqLiWeMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEA
CETnhlEnCJVDXoEtSSwUBLP/147sqiu9a4TNqchTHJObwTwDPUMaU6XIs2OTMmFu
GeIYpkHXzTa9Q6IKlc7Bt2xkSeY3siRWCxvZekMxPvv7YTcnaVlZzHrVfAzqNsTG
P3J//C0j+8JWg6G+zuo5k7pNRKDY76GxxHPYamdLfwk=
-----END CERTIFICATE-----
EOD;
}
}
 
//Build a request object from the current request
$request = OAuthRequest::from_request(null, null, array_merge($_GET, $_POST));
 
//Initialize the new signature method
$signature_method = new OrkutSignatureMethod();
 
//Check the request signature
@$signature_valid = $signature_method->check_signature($request, null, null, $_GET["oauth_signature"]);
 
//Build the output object
$payload = array();
if ($signature_valid == true) {
$payload["validated"] = "Success! The data was validated";
} else {
$payload["validated"] = "This request was spoofed";
}
 
//Add extra parameters to help debugging
$payload["query"] = array_merge($_GET, $_POST);
$payload["rawpost"] = file_get_contents("php://input");
 
//Return the response as JSON
print(json_encode($payload));

--------------------- Source Code ------------------------

너무도 당연한 이야기지만 $signature_vaild == true 인 경우
DB단과 작업을 진행하거나, 서버쪽 작업을 진행하면 된다.

이렇게 대놓고 소스코드에 써있는데 한참을 보고 알아버리다니....
역시 제 프로그래밍 기초에 대한 회의감마저 드네요;;

2009. 12. 9.

php에서 sprintf로 쿼리문 작성하기.

보통 php에서 쿼리문을 작성할때는 이렇게 한다.

 

$query = "SELECT * FROM users WHERE id = $id";

 

 

이번에는 sprintf로 쿼리문을 작성해보면

 

$query = sprintf("SELECT * FROM users WHERE id = %d", $id);

 

이렇게 할 수 있다.

 

 

php에서 sprintf를 이용해서 쿼리문을 작성하는 경우,

 

쿼리와 변수를 분리시킬 수 있고, 더 깔끔한 코드가 작성된다.

 

 

$query = sprintf("SELECT * FROM users

                  WHERE  user='%s'

                  AND    password='%s'",
                 
mysql_real_escape_string($user
),
                 
mysql_real_escape_string($password
));

 

위와 같은 쿼리문은  왜 sprintf를 이용해야 하는지에 대한 좋은 예이다.