• PHP의 객체 (2/2) (메소드, 속성, 상수, 메소드 범위, 상속) 2017-02-06
  • PHP의 객체 (2/2) (메소드, 속성, 상수, 메소드 범위, 상속)


     

     



    1.메소드


    $this 는 현재의 객체에 접근할 때 사용한다. $this를 사용해서 현재 객체의 속성 또는 함수를 호출한다.


     

    <?php
     
        $object = new User();            // User 객체 생성
        
        $object->name = "Hyun";       // name 속성에 Hyun 대입
        
        echo $object->get_name();    // Hyun 출력,  User 객체의 get_name() 함수 실행 
      
       
         class User{                      // User 객체
            
            public $id, $name
             
            function get_name(){
            
                return $this->name;         // 현 객체(User)의 name 속성 값 반환    
                
            }
    ?>

     

     

    PHP5에서는 객체로부터가 아닌 클래스로부터 호출되는 정적(static) 메소드를 정의할 수 있다. 정적 메소드는 어떤 객체 속성에도 접근성을 갖지 않는다.

    정적메소드의 호출은 -> 가 아닌 더블콜론(::)으로 호출된다.

    정적메소드는 객체가 아닌 클래스로 부터 호출된다.

     

     

    <?php
     
        User::name_string();                 //  Your name is Hyun 출력
                                                    //User 클래스의 static형 name_string() 출력
        
        
        class User{
            
            static function name_string(){             // static 형 name_string 메소드 선언
                
                echo "Your name is Hyun";            // "Your name is Hyun 출력
                
             }
            
        }
    ?>

     

     

    2. 속성 선언

     

    속성은 처음 사용될 때 암묵적으로 정의할 수 있기 때문에 클래스 밖에서 선언할 수도 있다. 객체를 생성 후에 속성을 추가적으로 선언할 수 있지만, 좋은 코딩 방법이 아니다. 가독성과 유지보수를 위해서는 클래스 내에서 속성을 선언하는게 좋다.

    아래와 같은 코드는 정상적으로 실행되지만, 좋은 코딩 방법이 아니다.

     

     

    <?php
     
        $object = new User();                //  User 객체 생성
                                                   
        $object->name = "Hyun";          // User 객체에 name 속성 선언 후 Hyun 대입
        
        echo $object->name;               // Hyun 출력
        
        class User{
            $id;
        }
    ?>

     

    클래스 내에서 속성을 정의할 때 초기 값을 대입한다. 이때 값은 상수여야 하고, 함수나 표현식의 결과는 안된다.

     

     

    <?php
        
        class User{
            
            public $id = "abc";      // 유효함
            
            public $name = "Hyun";   // 유효함
            
            public $age = calcAge();    // 무효함 - 함수 호출
             
            public $score = $level *2;   // 무효함 - 표현식 사용
        }
    ?>

     

     

    3. 상수 선언

     

    define 함수로 전역 상수를 정의한 것과 같은 방법으로 클래스 내에 상수를 만들 수 있다.

    클래스 내에서 상수는 const 로 선언하며, 호출시에는 self 키워드와 더블콜론(self::)로 직접 참조된다.

    상수는 한번 정의하면 바꿀 수 없다.

    일반적으로 상수 정의는 대문자로 한다.

     

     

    <?php
         Translate::lookup();     // 1 출력 ; Transalte 클래스의 static형 함수 lookup() 호출
        
        class Translate{
            
            const ENGLISH = 0;       // 상수로 Englich = 0 선언
            
            const SPANISH = 1;       // 상수 선언
            
            const FRENCH = 2;        // 상수 선언
            
            const GERMAN = 3;       // 상수 선언
            
            
            static function lookup(){      // static 형 lookup 함수 선언
                
                echo self::SPANISH;        // 1 출력; 클래스의 상수 SPANICH 참조
                
            }
    ?>

     

     

    4. 속성과 메소드 범위

     

    PHP5는 속성과 메소드 범위를 제어하는 데 public, protected, private 를 제공한다.

     

    public

    var나 public 키워드를 사용해 변수를 정의할 때나 변수가 처음 사용되는 시점에 암묵적으로 정의될 때 이런 속성은 기본이다. var는 더 이상 사용하지 않지만 PHP에서 이전 버전과 호환성을 위해서 남겨져 있기 때문에 var와 public은 상호 교체 가능하다. 메소드는 기본으로 public을 가정한다.

     

    protected

    여기서 속성과 메소드는 객체의 클래스 메소드와 서브클래스의 메소드에서만 접근 가능하다.

     

    private

    여기서 멤버는 서브클래스는 안 되고, 같은 클래스 내의 메소드에서만 참조 가능하다.

     

     

    public, protected, private 선택

    - 해당 코드 외부에서 이 멤버에 접근해야 할 때와 서브클래스에서 상속받을 때 public을 사용한다.

    - 해당 코드 외부에서 이 멈베어 접근하면 안 되지만, 서브클래스에서 상속받아야 할 때 protected를 사용한다.

    - 해당 코드 외부에서 접근해서도 안 되고, 서브클래스에서도 상속받으면 안 될때 private를 사용한다.

     

     

    <?php
         
        class Example{
            
            var $name = "Hyun";    // public과 같지만 사용하지 않음
            
            public $age = "29";     // public 속성
            
            protected $location;   // protected 속성
            
            private function admin(){   // private 메소드
                
            }
    ?>

     


    5. 상속

     

    클래스를 만들면 서브클래스를 파생할 수 있다. 서브클래스를 사용하면 힘들게 코드를 다시 작성해야 하는 일을 어느 정도 피할 수 있다.

    이럴때 extends 연산자를 사용해 상속을 할 수 있다.

    extends를 사용하여 확장하면 서브클래스에서 부모 클래스의 속성을 사용할 수 있다.

     

     

    <?php
         
        $object = new Subscriber;               // Subscriber 객체 생성
        
        $object->name = "Hyun";                 // name 속성에 Hyun 대입
        
        $objcet->password = "abc123";        // password 속성에 abc123 대입
        
        $bojcet->display();                  // Name : Hyun   Pass : abc123  출력    
                                                      // Subscriber 객체의 display 함수 실행
        
        
        class User{                // User 객체
            
            public $name;          
            
            function save_user(){
                
                echo "Save User code goes here";
                
            }
       }
            
         class Subscriber extends User{              // User 객체를 상속한 Subscriber 객체
            
            public $password;
            
            function display(){
                
                echo "Name : " . $this->name . "<br />";     // 상속받은 User 객체의 name 변수 접근
                echo "Pass : " . $this->password;
                
            } 
         } 
    ?>

     

     

    부모 연산자

     

    부모 클래스에서 사용한 것과 같은 이름으로 서브클래스의 메소드를 정의하려고 하면, 부모 클래스의 메소드를 대체한다.

    하지만 가끔 부모클래스의 메소드에 접근해야 한다. 이때는 parent(parent::) 연산자를 사용한다.

    자신의 클래스의 메소드를 호출할 때는 self(self::)를 사용한다.

     

     

    <?php
         
       $object = new Son;                 // Son 객체 선언
     
       $object->test();                      // [Class Son] I am Luke 출력
     
       $object->test2();                    // [Class Dad] I am your Father
     
       $object->test3();                    // [Class Son] I am Luke 출력
     
     
     
       class Dad{                             // Dad 클래스
        
           function test(){                    // test 메소드
            
              echo "[Class Dad] I am your Father<br/>";    //[Class Dad] I am your Father 출력
            
           }
        }
        
       class Son extends Dad{              // Dad 객체를 상속한 Son 클래스
        
           function test(){              // test() 메소드
            
               echo "[Class Son] I am Luke<br/>";   // [Class Son] I am Luke 출력
            
           }
        
           function test2(){                // test2() 메소드
            
               parent::test();               // [Class Dad] I am your Father 출력
                                                 // 부모 Dad 의 test() 메소드를 실행한다.   
            }
            
           function test3(){               // test3() 메소드
            
               self::test();                  // [Class Son] I am Luke 출력
                                                // 현재 클래스(Son)의 test() 함수 실행
            }
         }
            
    ?>

     

     

    서브 클래스 생성자

     

    클래스를 확장하고 생성자를 정의할 때 PHP는 자동으로 부모 클래스의 생성자 메소드를 호출하지 않는다. 모든 초기화 코드가 확실히 실행되려면 서브클래스는 부모의 생성자를 호출해야 한다.

     

     

    <?php
         
       $object = new Member();      // Member 객체 생성
     
       echo $object->gender;          // Man 출력    
     
       echo $object->name;             // Hyun 출력
     
     
       class User{                         // User 클래스
           
           public $gender;                // gender 속성
        
           function __construct(){          // User 클래스 생성자
            
               $this->gender ="Man";      // gender 속성에 Man 으로 초기화
            
            }
        }
        
        class Member extends User{      // User 객체를 상속한 Member 클래스
        
           public $name;                      // name 속성 선언
        
           function __construct(){           // Membere 객체 생성자
        
              parent::__construct();          // 부모(User) 객체의 생성자 실행
            
              $this->name ="Hyun";           // name 속성에 Hyun 대입
          }
        
       } 
     
    ?>

     

    Final 메소드

     

    서브클래스가 슈퍼클래스의 메소드를 대체하는 것을 원하지 않을 경우 final 키워드를 사용한다.

     

     

    <?php
         
       class User{
        
           final function copyright(){
            
             echo "This class was written by Joe Smith";
            
           }
       }
    ?>
    Close
  • PHP의 객체 (1/2) (클래스 정의, 객체 생성, 접근, 생성자, 소멸자) 2017-02-06
  • PHP의 객체 (1/2) (클래스 정의, 객체 생성, 접근, 생성자, 소멸자)


     


    객체지향 언어(OOP, object-oriented programming)이 발전하면서, 함수 이상으로 코드를 재사용할 수 있게 되었다. 객체를 통해서 데이터를 요청하고, 객체를 통해서 데이터를 받아온다. 각각의 객체는 각각의 역할에 따른 데이터를 가지고 기능을 수행한다. 객체를 통해 코드를 재사용하면서, 적은 코드로 효율적인 프로그래밍이 가능해졌다.

    객체를 사용하는 프로그램을 만들 때는 데이터와 코드의 합성인 클래스를 디자인 해야 한다. 이 클래스에 기반한 새 객체를 클래스의 인스턴스(instance)나 어커런스(occurrence)라고 한다.


    클래스 정의


    객체는 class 키워드로 클래스를 정의한다. 클래스의 정의에는 클래스 이름(대소문자 구분)과 속성, 메소드가 포함된다.

    클래스는 데이터를 저장하는 속성 값을 가지고 있으며, 데이터를 가공/처리 하기 위한 메소드를 포함한다.


     

     

     

    <?php
      
       class User{     // User 클래스 선언
            
            public $id$email$name$birthday;  //public으로 변수 선언
     
            function printUser(){   // User 클래스에 printUser 메소드 선언
                print_r($this);      // User 클래스 Print
            }
        }
     
    ?>

    print_r 함수는 객체의 정보를 출력해준다. 변수에 대입된 값이 없을때 printUser() 함수를 실행하면

    User Object([id] =>   [email] =>   [name] =>    [birthday] =>  )    가 출력된다.

     

    객체  생성

     

    객체를 생성하려면 new 키워드를 사용한다.

     

     

    <?php
      
       $object = new User;     // new 키워드로 User 객체를 생성한다.
     
       class User{     // User 클래스 선언
            
            public $id$email$name$birthday;  //public으로 변수 선언
     
            function printUser(){   // User 클래스에 printUser 메소드 선언
                print_r($this);      // User 클래스 Print
            }
        }
     
    ?>

    객체 접근

     

    객체의 속성에 접근하는 방법은 -> 를 사용하는 것이다.

    new로 생성한 User 클래스를 대입한 $object의 name 속성에 접근하기 위해서는

     

    $object->name 

     

    또는 객체의 메소드인 printUser()에 접근하기 위해서는

     

    $object->printUser();  

     

    이다.

    속성이나 메소드에 접근할때는 $ 표시를 붙이지 않도록 주의해라. $를 붙이면 해당 변수를 가르키기 때문에 의도하지 않은 접근이나 오류를 발생시킬 수 있다.

     

    만약 $name에 "Hyun"이 대입되어 있을때,  $object->$name 을 사용하면,

    $name은 "Hyun" 이기 때문에 $object->Hyun 이 된다.

    $object(User 클래스)의 속성에는 Hyun이 없기 때문에 에러가 발생한다.

     

     

    <?php
      
       $object = new User;     // new 키워드로 User 객체를 생성한다.
     
       $object->printUser();  // 비어있는 User 객체 출력
     
       $object->id = "3"// User 객체의 id 속성에 3 대입
     
       $object->name = "Hyun";  // User 객체의 name 속성에 Hyun 대입
     
       $object->printUser();  // User 객체 출력 User object( [id]=>3 [email]=> [name]=>hyun [birthday]=>)
     
       class User{     // User 클래스 선언
            
            public $id$email$name$birthday;  //public으로 변수 선언
     
            function printUser(){   // User 클래스에 printUser 메소드 선언
                print_r($this);      // User 클래스 Print
            }
        }
     
    ?>

     

    객체 복제

     

    new로 객체를 생성하여 매개 변수로 넘길 때는 참조로 넘어간다. 따라서 새로운 메모리를 할당하는 것이아닌 객체의 주소값을 전달하는 것이다. 다시 말해서 객체를 대입하는 것은 전체를 복사하는 것이 아니다.

    참조로 주소값을 전달하면, 같은 메모리의 인스턴스를 사용하기 때문에 한쪽에서 객체의 속성에 접근하여 값을 변경하면, 다른 변수에서 해당 속성에 접근해도 같이 변경되어 있다.

    새로운 객체의 복제를 원한다면 clone 키워드를 사용하면 된다.

     

     

    <?php
     
       $object1 = new User();         // User 객체 생성하여 object1 변수에 대입
     
       $object1->name = "Hyun";     // object1 객체의 name 속성에 Hyun 대입
     
      $object2 = $object1;              // object1 객체의 참조값 object2에 대입
     
      $object2->name = "Rang";     // object2 객체의 name 속성에 Rang 대입
     
      
      echo "object1 name = " . $object1->name . "<br>";     // Rang 출력
     
      echo "object2 name = " . $object2->name . "<br>";    // Rang 출력
     
     
      $object3 = clone $object1;                   // object1 객체를 복제하여 object3에 대입
     
      $object3->name = "Ten";                     // object3 객체의 name 속성에 Ten 대입
     
     
      echo "object1 name = " . $object1->name . "<br>";    // Rang 출력
     
      echo "object3 name = " . $object3->name . "<br>";    // Ten 출력
     
     
      class User{     // User 클래스 선언
            
            public $id$email$name$birthday;  //public으로 변수 선언
     
            function printUser(){   // User 클래스에 printUser 메소드 선언
                print_r($this);      // User 클래스 Print
            }
        }
    ?>

     


    생성자 __construct()

     

    새로운 객체를 생성할 때 매개 변수의 리스트를 호출되는 클래스로 전달할 수 있다.

    이것은 여러 가지 속성을 초기화하는 생성자(Constructor)라고 하는 클래스 내에 특별한 메소드로 전달된다.

    생성자는 __construct() 를 메소드 이름으로 사용한다.

     

     

    <?php
     
      $object = new User();                  //  User 객체 생성하면서 __construct() 함수 실행
     
      echo $object->name;            //  Hyun 출력
     
     
       
      class User{     // User 클래스 선언
            
            public $id$email$name$birthday;  //public으로 변수 선언
     
            function __construct(){       // 생성자 선언
                
                $this->name = "Hyun";     // 객체가 생성되면서 name 속성에 Hyun 대입   
            
            }
            function printUser(){   // User 클래스에 printUser 메소드 선언
                print_r($this);      // User 클래스 Print
            }
        }
    ?>


    소멸자 __destruct()

     

    PHP 코드가 마지막 참조를 하고 났을 때나 스크립트가 끝에 도달한 경우 소멸자를 실행하며, 객체를 해제한다.

    소멸자 메소드는 __destruct() 로 명명한다.

     

     

    <?php
     
      $object = new User();                  //  User 객체 생성
     
      echo $object->name;            //  Hyun 출력
     
     
       
      class User{     // User 클래스 선언
            
            public $id$email$name$birthday;  //public으로 변수 선언
     
            function __construct(){       // 생성자 선언
                
                $this->name = "Hyun";     // 객체가 생성되면서 name 속성에 Hyun 대입   
            
            }
            
            function __destruct(){
            
               echo "User 객체 소멸";    
            
            }
            
            function printUser(){   // User 클래스에 printUser 메소드 선언
                print_r($this);      // User 클래스 Print
            }
        }
    ?>
     
    Close
  • [ERROR] Native table ‘performance_schema’.’table name’ has the wrong structure 2016-04-07
  • After I upgraded an instance to MySQL 5.7 I noted the following errors in the log;

    2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'events_statements_current' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'events_statements_history' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'events_statements_history_long' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'events_statements_summary_by_thread_by_event_name' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'events_statements_summary_by_account_by_event_name' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'events_statements_summary_by_user_by_event_name' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'events_statements_summary_by_host_by_event_name' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'events_statements_summary_global_by_event_name' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'events_statements_summary_by_digest' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'users' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'accounts' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'hosts' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'socket_instances' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'socket_summary_by_instance' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'socket_summary_by_event_name' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'session_connect_attrs' has the wrong structure 2013-05-23 11:40:24 30199 [ERROR] Native table 'performance_schema'.'session_account_connect_attrs' has the wrong structure

    You can fix this with mysql_upgrade. Be aware of what the tool does before running this. Most importantly bear this in mind;

    Because mysql_upgrade invokes mysqlcheck with the –all-databases option, it processes all tables in all databases, which might take a long time to complete. Each table is locked and therefore unavailable to other sessions while it is being processed. Check and repair operations can be time-consuming, particularly for large tables.

    ?View Code BASH
     
     mysql_upgrade -h localhost -u root -p

    After you have restarted the instance the errors will no longer be reported.


    Close
  • centos5.5 下安装 nodejs socket.io 2016-02-13
  • centos5.5 下安装python2.7.2
    查看centos5.5默认python版本
    [root@Django ~]# python
    Python 2.4.3 (#1, Sep 3 2009, 15:37:12)
    [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    下载python2.7.2
    [root@Django ~]# wget http://python.org/ftp/python/2.7.2/Python-2.7.2.tgz
    安装python2.7.2
    [html] view plaincopy
    [root@Django ~]# tar xvf Python-2.7.2.tgz
    [root@Django ~]# cd Python-2.7.2
    [root@Django Python-2.7.2]# ./configure
    [root@Django Python-2.7.2]# make && make install
    python2.7 默认安装在/usr/local/lib/python2.7

    查看安装的python2.7
    [root@Django Python-2.7.2]# /usr/local/bin/python
    Python 2.7.2 (default, Apr 5 2012, 14:37:00)
    [GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

    [root@Django Python-2.7.2]# /usr/local/bin/python -V
    Python 2.7.2

    这个时候系统默认的python还是
    [root@Django Python-2.7.2]# python
    Python 2.4.3 (#1, Sep 3 2009, 15:37:12)
    [GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

    修改系统默认的python(为什么不删除默认的python呢,这是因为yum是基于2.4.3的)
    [root@Django Python-2.7.2]# mv /usr/bin/python /usr/bin/python.bak
    [root@Django Python-2.7.2]# ln -s /usr/local/bin/python2.7 /usr/bin/python
    这个时候我们修改了系统默认的python 版本为2.7 但是yum 是基于2.4的,如果这个时候你使用yum服务是会出错的
    恢复不能使用的yum yum-update
    [root@Django Python-2.7.2]# vi /usr/bin/yum
    [root@mysqlnode2 ~]# vim /usr/sbin/yum-updatesd
    将首行显示的 !#/usr/bin/python 修改为 !#/usr/bin/python2.4
    为了后续方便软件的安装,需要使用easy_install ,则需要安装Setuptools模块
    下载
    [root@Django ~]# wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg#md5=fe1f997bc722265116870bc7919059ea
    安装
    [root@Django ~]# sh setuptools-0.6c11-py2.7.egg
    Processing setuptools-0.6c11-py2.7.egg
    Copying setuptools-0.6c11-py2.7.egg to /usr/local/lib/python2.7/site-packages
    Adding setuptools 0.6c11 to easy-install.pth file
    Installing easy_install script to /usr/local/bin
    Installing easy_install-2.7 script to /usr/local/bin

    Installed /usr/local/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
    Processing dependencies for setuptools==0.6c11
    Finished processing dependencies for setuptools==0.6c11
    ---------------------------------------------------------------------------------------------------------------------------------------
    nodejs설치
    ./configure파일 line1 파이선 설치 경로 다시 설정
    #!/usr/bin/env python -> /usr/bin/python
    ./configure make mmake install
    ---------------------------------------------------------------------------------------------------------------------------------------
    socket.io 설치
     npm install socket.io

    server
    socket.io.server.js
    var socketio     = require('socket.io');
    var http         = require('http');
    var fs            = require('fs');

    var server = http.createServer(function (request, response){
        //read html
        fs.readFile('HTMLPage.html', function (error, data){
            response.writeHead(200, {'Content-Type':'text/html'});
            response.end(data);
        });
    }).listen(8087);

    var io = socketio.listen(server);
    io.on('connection',function (socket) {

    });


    client
    <!DOCTYPE html>
    <html>
        <head>
            <script src="/socket.io/socket.io.js"></script>
            <script>
                window.onload = function (){
                    //create socket
                    var socket = io.connect();
                    console.log('hello');
                };
            </script>
        </head>
    </html>

    Close
  • Sublime Text2 中Emmet(之前叫Zencoding)插件安装以及使用 2015-11-08
  • Emmet插件安装

    Emmet放出来有一段时间了一直安装失败,今天再仔细的看了文档在安装上。

    在windows上安装时很有可能报错说PyV8安装失败,需要到一个github地址上去安装。详细的安装方法是:

    官方说的用Package Control :install package 安装Emmet十有八九会报错。所以这里介绍手动安装过程:

    • 先安装PyV8,点击此处选择适合的操作系统版本,将下载的zip包放在 Sublime Text 2的Package包中,可以通过ST2的菜单Preferences ->Browser Packages进入该文件夹,win7默认的是C:Users[用户名]AppDataRoamingSublime Text 2Packages将zip包解压出来的文件放到新建的PyV8文件夹中

    • 下载Emment最新版此处解压到Packages文件夹中

    • 重启 OK

      2013/10/31 update: 最近Emmet插件有更新,安装起来不需要手动安装PyV8了。直接用Package Install就行可以。

    Emmet的新特征

    默认的tag是div

     .item [tab] <div class="item"></item> 

    聪明的子标签嵌套规则,比如ul的子标签默认就是li

     ul>.item*2 [tab] <ul> <li></li> <li></li> </ul> 

    ^向上,相当于将当前的"上下文"放到父标签上,写dl>dt/dd的时候用的上

     dl>(dt>p>a[name=dt$]^^dd{description$})*2 [tab] <dl> <dt> <p><a href="" name="dt1"></a></p> </dt> <dd>description1</dd> <dt> <p><a href="" name="dt2"></a></p> </dt> <dd>description2</dd> </dl> 

    $的功能增强

    之前用zencoding的时候我想写一组checkbox各加上一个label,checkbox的name属性一致,但是id不一样,而且对应的label的for属性能对应到checkbox的id上。

     (input:checkbox[name=cb1]#cbitem$$+label[for=cbitem$$]{label$})*2 [tab] <input type="checkbox" name="cb1" id="cbitem01"> <label for="cbitem01">label1</label> <input type="checkbox" name="cb1" id="cbitem02"> <label for="cbitem02">label2</label> 

    zencoding写出来的label和id是不能编号的。Emmet解决了这个问题。

    其他的功能都是原来zencoding有的,给一些参考资料:

    zencoding cheatsheet啥也不说了。赶紧去打印贴着吧。

    Close
  • 使用 Zend Opcache 加速 PHP 2015-11-07
  • Optimizer+ 是 Zend 开发的闭源但可以免费使用的 PHP 优化加速组件,是第一个也是最快的 opcode 缓存工具。现在,Zend 科技公司将 Optimizer+ 在 PHP License 下开源成为 Zend Opcache。

    Zend OPcache 通过 opcode 缓存和优化提供更快的 PHP 执行过程。它将预编译的脚本文件存储在共享内存中供以后使用,从而避免了从磁盘读取代码并进行编译的时间消耗。同时,它还应用了一些代码优化模式,使得代码执行更快。

    1. 什么是 opcode 缓存?

    当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销。如果动态内容的性能瓶颈不在于 CPU 和内存,而在于 I/O 操作,比如数据库查询带来的磁盘 I/O 开销,那么 opcode cache 的性能提升是非常有限的。但是既然 opcode cache 能带来 CPU 和内存开销的降低,这总归是好事 —— 本着环保的态度,也应该尽量减少消耗不是? :D

    现代操作码缓存器(Optimizer+,APC2.0+,其他)使用共享内存进行存储,并且可以直接从中执行文件,而不用在执行前“反序列化”代码。这将带来显着的性能加速,通常降低了整体服务器的内存消耗,而且很少有缺点。

    2. Optimizer+ 与 APC 的优缺点对比

    Optimizer+ 于 2013年3月中旬改名为 Opcache。

    根据 PHP wiki 上的讨论,Zend Opcache 即将整合到 php 5.5 中。作为 APC 的竞争对手,新生的 Zend Opcache 很有可能取代 APC 的位置,虽然 OptimizerPlus 没有象 APC 那样的 user cache 功能。

    OPTIMIZER+ 相对 APC 的优点

    1. 性能。根据测试,Zend Optimizer+ 始终优于 APC。随代码差异,每秒钟处理的请求数高 5~20%。Google doc 上记录的测试结果中,WordPress 2.1.1(不知道为什么不用个新版本的 WP 来测试),性能提高约 8%。理论上来说,对于 WP 3.5.1,性能应该也能得到大约 5~10% 的提升吧。对于运行 WordPress 的服务器而言,使用 Optimizer+ 可以显著降低 CPU 使用率和提高页面加载速度(graphics here)。
    2. 支持新的 PHP 版本。Zend 和 PHP 社区都会帮助 Optimizer+ 能够支持最新版本的 PHP。
    3. 可靠性。Optimizer+ 拥有可选的损坏检测能力,可以防止因数据损坏而导致的服务器崩溃。
    4. 更好的兼容性。PHP 社区打算让 Optimizer+ 与社区支持的所有 PHP 版本相兼容。

    APC 相对 OPTIMIZER+ 的优势

    1. APC 有数据缓存 API,而 Optimizer+ 没有。
    2. APC 能够回收旧的无效的脚本占用的内存。APC 有内存管理器,可以将那些不再使用的脚本关联的内存进行回收。而 Optimizer+ 不同,它将这样的内存标记为“脏的”,但并不会回收它们。一旦“脏的”内存占用配置阈值的百分比达到一定值,Optimizer+ 就将自己重新启动。这种行为在稳定性上既有优势也有劣势。

    3. 使用 Zend Opcode

    现在已经可以使用 Zend Opcache 替代 APC 作为 PHP 优化加速工具了。目前的 Zend Opcode 兼容 PHP 5.2.*、5.3.*、5.4.* 和 PHP-5.5 开发版。不过,将来会取消对 PHP 5.2 的支持。

    注意:Zend Opcache 与 eaccelerator 相冲突。要安装 Zend Opcache,可能需要先卸载 eaccelerator —— 如果你用了这个加速模块的话。

    从源码安装并配置

    Zend Opcache 的源代码托管在 github 上,目前还是叫做 ZendOptimizerPlus

    安装步骤详见其 README 文件。

    #phpize
    #./configure --with-php-config=$PATH
    #make
    #make install
    修改 php.ini
    [opcache]
    zend_extension=/php/lib/php/extensions/no-debug-non-zts-20121212/opcache.so
    opcache.memory_consumption=128
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=4000
    opcache.revalidate_freq=60
    opcache.fast_shutdown=1
    opcache.enable_cli=1
    opcache.enable=1

    Close
  • Zend Opcache 모니터링 프로그램 설치 및 이용 2015-11-07
  • 현재  PHP 캐시 플러그인은  일반적으로  APC, eAccelerator, XCache 등이 있습니다,  오늘 소개할 Opcache는 기존의 APC(ZendOptimizerPlus 캐쉬를 대체) 등 보다 5~20% 성능 향상을 기대할 수 있습니다.

    오늘은  PHP 5.5 이상에서 사용할 수 있는 통합 Zend Opcache( http://pecl.php.net/package/ZendOpcache )에 대하여 알아 보겠습니다.

     

    1. Zend Opcache 원리

    Zend Opcache은 PHP로 실행되는 데이터의 메모리 버퍼의 중복을 피할 수 있으며 이로 인한 php 소스 컴파일 속도의 향상,  이미 컴파일 된 코드에 대하여 버퍼에서 재사용 하므로서 서버 응답속도 및 부하를 줄일 수 있습니다.

    다시말해,  Zend Opcache는 미리 처리된 데이터를 저장하고 재사용하는 방법입니다. 이 방법을 사용하면 처리된 결과데이터가 메모리(빠른 저장장치)에 저장됩니다. 그러면 나중에 다시 사용할때는 별도의 실행과정을 거치지않고, 그냥 바로 메모리에 저장되어있는 결과데이터를 불러오기만 하면 됩니다. 즉, 중복되고, 쓸때없는 처리과정을 다시 하지않기때문에 속도가 상당히 빨라집니다.

    WordPress, XE 등과 같이 php 소스 많은 사이트 운영시 캐쉬의 성능에 따라 사이트 접속속도에 차이가 있을 수 있으니 우수한 성능의 캐쉬 플러그인 선택에 도움이 되었으면 합니다.

    Zend Opcache은  PHP 5.5 이상에서 제공되지만, PHP 5.2.*, 5.3.*, 5.4.* 버전에서도  –enable-opcache 옵션을 이용하므로서 이용할 수 도 있습니다.

     본 문서에서는 php Memcache 설치는 제외 하였습니다.

     

     

    2. Zend Opcache 모니터링 프로그램 설치

    캐시 패키지인 Zend Opcache 모니터링 프로그램을 설치해 보겠습니다.

    먼저, Zend Opcache는 php5.5 이상 버전에서는 기본으로 제공되는 패키지지만, php5.4이하 버전에서는 기본으로 설치가 되어 있지 않습니다. 

    php5.4 이하 버전 사용자는 먼저 Zend Opcache을 설치해야 됩니다.

     

    php OPCache를 설치하면 다음과 같이 phpinfo 페이지를 확인 할 수 있습니다.

    opcache



     

     

     


    Zend Opcache 모니터링 프로그램

    Zend Opcache 모니터링 프로그램은 Opcache-Status ,opcache-gui, ocp.php 이렇게 크게 3가지로 나누며, 해당 프로그램은 github 사이트에서 손 쉽게 다운로드 받으 실 수 있습니다.

    각각의  프로그램을  설치 하는 순서는 다음과 같이 하시면 됩니다.

     

    1) Opcache-Status by Rasmus Lerdorf 설치

    먼저 웹서버 기본 Documents Root폴더에OPCache 파일을 생성합니다.
    OPCache 파일생성
    cd /var/www/example.com/OPCache/
    opcache-status 설치
    # wget https://raw.github.com/rlerdorf/opcache-status/master/opcache.php
     
     
    OPCache 폴더에 대하여 IP 접근 제어를 하고 싶은 경우 httpd.conf 에 다음 내용을 추가 합니다.
    #
    # Zend OPCache
    #
    <Directory “/var/www/example.com/OPCache/*”>
        Options -Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from <허용IP주소>
        Deny from all
    </Directory>
     
     

    접속주소 : http://www.도메인.com/OPCache/opcache.php

    로 접속하면 다음과 같은 페이지를 확인할 수 있습니다.

    op011



     

    2) opcache-gui by amnuts 설치

     #wget https://github.com/amnuts/opcache-gui/archive/master.zip
     #unzip master

    접속주소 : http://www.도메인.com/OPCache/op.php

    로 접속하면 다음과 같은 페이지를 확인할 수 있습니다.

    op02

    – 캐싱된 페이지 리스트의 확인

    op04

     


     

    3) ocp.php by ck-on 설치

    wget https://gist.github.com/ck-on/4959032/raw/0b871b345fd6cfcd6d2be030c1f33d1ad6a475cb/ocp.php
     

    접속주소 : http://www.도메인.com/OPCache/ocp.php

    로 접속하면 다음과 같은 페이지를 확인할 수 있습니다.

    op03

     

    4) Zend Opcache 도구의  선택

     Zend Opcache 모니터링 프로그램  3가지 중 어떤 것을 사용하셔도 되며, 보시는 것과 같이 각각 부각되는 장점 부분이 있으니 마음에 드는 모니터링 프로그램을 설치하거나 모두 설치하여 운영해 보시는 것도 좋으리라 생각 됩니다.

     
     

     

    5) Zend Opcache 기본설정

     php.ini  의opcache 기본 옵션 및 설명
     
    [opcache]
    ;활성화 여부 결정
    opcache.enable=1
     
    ; OPCache 공유 메모리 저장소 사이즈
    opcache.memory_consumption=64
     
    ; OPCache 해쉬 테이블에서 가질수 있는 키값의 최대 값.
    ; 이는 200 ~ 100000 사이에 값만 가질 수 있다. 
    opcache.max_accelerated_files=4000
     
    ; 이 값을 활성화 하면, OPCache 는 현재 작업디렉토리를 스크립트 키에 추가하고,
    ; 같은 이름(basename) 을 가진 파일들사이에 가능한 충돌을 제거하게 된다.
    ; 이 값을 비활성화하면 성능이 향상되지만, 존재하는 애플리케이션이 깨질 수 있다.
    opcache.use_cwd=1
     
    ; 이것을 비활성화하면, OPCache 를 수동으로 리셋해주거나
    ; 파일시스템이 변한것에대해 효과를 얻기위해서는 웹서버를 재시작 해줘야만 한다.
    opcache.validate_timestamps=1
     
    ;갱신 때문에 스크립트의 타임 스탬프를 체크하는 빈도.(초 단위) 0 하자 OPcache은, 리퀘스트마다 갱신을 체크합니다.
    ; 주의 할 점은 이 옵션은 php 소스 파일이 변경되었는지 검사하는 간격으로 기본 2초, 입니다, 현재 개발하고 있는 사이트라면 기본값 사용울 추천합니다.
    ; 또한 xe 등 txt cache 파일등의 이유로 xe 가 사용되는 사이트라면 0으로 지정하시기 바랍니다.

    opcache.revalidate_freq=60

     
    ;해제하면 최적화한 코드의 크기를 줄이기 위해서 OPcode캐시에서 모든 다큐멘테이션·코멘트가 폐기됩니다. 이 설정 지시문을
    ;해제하면 주석을 위해서 코멘트·퍼스에 의존하는 애플리케이션 및 프레임워크를 파괴할지도 모릅니다. 그것에는 Doctrine,
    ;Zend Framework 2및 PHPUnit가 포함됩니다.
    opcache.save_comments=1

     

     

     출처 : http://idchowto.com/index.php/zend-opcache-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%9D%B4%EC%9A%A9/

     

    Close
  • centos6 한글 입력 2015-11-01
  • korea
    #yum install ibus
    #yum install fonts-korean
    #yum install kde-i18n-Korean
    #yum groupinstall korean-support -x xorg-x11-server-Xorg

    Chinese
    #yum install "@Chinese Support"
    Close
  • samba 2015-11-01
  • SMB install
    #yum install samba samba-client samba-swat
    #yum install cifs-utils
    #mount -t cifs //xxx.xxx.xxx.xxx/폴더 /마운트 폴더 -o username=삼바 아이디

    Close