카테고리 : php
-
PHP 7.2 설치(업그레이드) [CentOS 7 / remi RPM repository]
PHP를 CentOS에 설치하는 방법은 소스를 컴파일하거나 yum을 사용하는 방법이 주로 사용된다. 나의 경우는 예전엔 컴파일 방법을 주로 사용했었으나 RPM 기반으로 설치하는 것이 더 편리하기도 하고 성능 최적화에 유리하다는 소식을 접하고 yum을 주로 사용하고 있다(yum을 사용해서 PHP를 설치할 경우 CentOS에 포함된 PHP의 버전은 매우 낮기 때문에 외부 RPM repository를 사용하는 경우가 많다). PHP 최신 버전을 제공하는 외부 repository 중 유명한 곳은 webtatic과 remi 등이 있다. 이중
-
PHP Composer Autoloader 최적화
Composer Autoloader 최적화 Composer Autoloader는 상대적으로 빠르게 실행되나 PSR-4 및 PSR-0 autoload 규칙이 설정되는 방식으로 인해 클래스 이름을 확인하기 전에 파일 시스템을 검사해야 한다. 이 경우 성능이 떨어지지만 개발 환경에서는 새로운 Class를 추가할 때 autoload 구성을 다시 작성하지 않고도 즉시 사용할 수 있으므로 편리하다. 그러나 production 환경에서는 클래스의 추가가 발생하지 않기 때문에 성능을 위해서 파일 시스템을 검사하지 않고 클래스를 로드하는 것이 좋다
-
PHP 에서 한글 파일명 사용시 pathinfo(), basename() 결과가 맞지 않는 문제 해결
PHP에서 path에 대한 정보를 얻기 위해 pathinfo()와 basename()을 많이 사용한다. 그런데 path 내에 한글과 같이 UTF-8 문자열이 포함될 경우 결과가 이상하게 나올 수 있다. 일단 아래의 소스 코드와 실행 결과를 보자. <?php $currentLocal = setlocale(LC_ALL, 0); echo 'Current Location : ' . $currentLocal . "<br/>"; $filepath = '/home/가 나 다.txt'; $info = pathinfo($filepath); echo
-
PHP에서 symlink()를 이용해 lock 구현하기
PHP에서 외부 Extensions 없이 간단히 lock을 구현하고자 할 때 file을 이용하는 경우가 많다(file에 대한 읽기/쓰기 lock을 말하는 것이 아니다). 예를들어 어떤 프로세스가 중첩되어 실행되는 것을 막기 위한 lock이 필요할 수 있다. 나의 경우는 Laravel의 Queue를 사용하면서 Daemon을 동시에 여러개를 띄운 상황에서 특정 작업의 중첩을 막기 위해 필요했다. Job에 대한 중복 실행은 Laravel의 Queue가 DB lock을 이용해 자체적으로 처리한다. 하지만 나는 Job의 중복 실행을 막는 것
-
PhpStorm에서 부분적으로 코드 포멧팅(code formatting) disable 하기
PhpStorm을 사용하면서 자주 이용하는 기능 중 하나가 code formatting 기능이다. 코드의 가독성을 높이고 code style을 유지하는데 도움이 되기 때문이다. 이 기능을 사용하면서 항상 불편했던 것 중 하나가 부분적으로 code formatting을 제외할 수 없다는 것이었다. 그런데 알고 보니 이미 부분적으로 code formatting을 제외하는 기능이 존재했다. PhpStorm 중 2016.x 와 2017.x 기준으로 Preferences > Editor > Code Style > Formatter Contr
-
laravel(또는 lumen) package 에서 schedule 추가
laravel을 사용하는 프로젝트에서 schedule 처리는 Task Scheduling에 안내되어 있는 것처럼 \App\Console\Kernel의 schedule(Schedule $schedule) 메서드 내에서 정의해서 사용한다. laravel 기반 프로젝트에 추가한 package(module)에서 직접 schedule을 추가하고 싶다면 어떻게 해야 할까? 이 부분에 대해서는 메뉴얼 상에 안내된 내용이 없다. 하지만 "How to schedule Artisan commands in a package?" 글을 참고하면 아래와 같
-
라라벨(laravel) log 파일 권한 변경
laravel 에서는 기본적으로 오류 로그를 "storage/logs"에 저장한다. 별다른 설정이 없다면 해당 경로에 실행 프로세스의 권한으로 로그 파일이 저장되는데 이것이 문제가 되는 경우가 있다. 예를들어 web server는 nobody 권한을 사용하고 crontab의 경우 root를 사용한다고 가정하다. crontab에 의해서 실행된 laravel 프로세스에서 오류가 발생하여 로그 파일이 생성 되었다면 이 파일의 권한은 기본적으로 root permission 에 644(-rw-r--r--)로 저장된다(서버 설정에 따라 다소
-
preg_replace()의 치환 문자열에서 이름이 지정된 서브 패턴의 역 참조 사용하기
preg_replace()는 이름이 지정된 서브 패턴에 대한 역 참조(named backreferences)를 지원하지 않는다. 일단 일반적인 역 참조를 사용하는 방법에 대한 예시를 보자. <?php $string = 'user/foo'; echo preg_replace('/^user\\/(?P<id>[^\\/]+)$/', 'user/profile/\\1', $string); // user/profile/foo 위의 예시에서 치환 문자열의 \\1 대신에 패턴에서 지정된 이름("id")을 사용하고자 한다고 가정하자. <?php $st
-
PHP PDO의 bindParam와 bindValue의 차이
PDO(PHP Data Objects)에서 Prepared statements 사용시 값을 bind하기 위해 PDOStatement::bindParam 또는 PDOStatement::bindValue를 주로 사용한다. 두개의 함수는 사용법이 거의 유사해서 어떤 차이가 있는지 알아둘 필요가 있다. 아래의 예시를 보면 정확한 차이를 바로 알 수 있다. <?php $sex = 'male'; $s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex'); $s->bindParam(':s
-
PHP 정규식(PCRE)의 모든 것 - 에필로그
앞선 글들에서 PCRE에 대한 전반적인 내용을 소개 했다. 일부는 내용이 이해하기 어려울 수 있다. 나름 이해가 어려운 부분은 예시를 추가해서 이해를 돕고자 했으나 부족할 것으로 보인다. PCRE를 익히는 가장 좋은 방법은 직접 패턴을 만들어 보면서 학습하는 것이다. PCRE에 대한 소개를 마치며 학습 및 활용에 도움이 될 수 있는 몇가지 사이트와 예시들을 남겨둔다. 정규식을 웹 상에서 테스트해 볼 수 있는 사이트를 소개한다(검색해보면 더 많은 사이트들이 존재하니 자신에게 맞는 사이트를 사용하면 된다). regular xpressi
-
PHP 정규식(PCRE)의 모든 것 - 재귀 패턴(Recursive patterns)
Recursive patterns (재귀 패턴) 무한대의 중첩 괄호를 허용하면서 괄호 안의 문자열을 일치시키는 문제를 고려해 보자. 재귀를 사용하지 않고 수행 할 수 있는 최상의 방법은 중첩의 고정된 깊이까지 일치하는 패턴을 사용하는 것이다. 임의의 중첩 깊이는 처리 할 수 없다. Perl 5.6은 정규식을 반복 할 수 있는 실험적 기능을 제공한다. 특수 항목 (?R)은 재귀의 특정 경우에 대해 제공된다. \( ( (?>[^()]+) | (?R) )* \) 이 PCRE 패턴은 괄호 문제를 해결한다(공백을 무시하도록 PCRE_EX
-
PHP 정규식(PCRE)의 모든 것 - 주석(Comments)
Comments (주석) 시퀀스 (?#는 다음 닫는 괄호까지 이어지는 주석의 시작을 표시한다. 중첩된 괄호는 허용되지 않으며 주석을 구성하는 문자는 패턴 일치에 전혀 영향을 미치지 않는다. PCRE_EXTENDED 옵션을 설정하면 캐릭터 클래스 외부의 이스케이프 처리되지 않은 # 문자가 패턴의 다음 줄바꿈 문자까지 이어지는 주석을 나타낸다. <?php $string = 'test'; echo preg_match('/te(?# 주석테스트)st/', $string) . "\n"; echo preg_match('/te#~~~~ st/',
-
PHP 정규식(PCRE)의 모든 것 - 조건부 서브 패턴(Conditional subpatterns)
Conditional subpatterns (조건부 서브 패턴) 조건부로 서브 패턴을 따르거나 어설션의 결과에 따라 두 개의 대체 서브 패턴 중 하나를 선택하거나 이전 캡처 서브 패턴이 일치하는지 여부를 결정할 수 있다. 조건부 서브 패턴의 가능한 두 가지 형태는 다음과 같다. (?(condition)yes-pattern) (?(condition)yes-pattern|no-pattern) 조건이 충족되면 "yes-pattern"이 사용된다. 그렇지 않으면 "no-pattern"(존재한다면)이 사용된다. 서브 패턴에 두 개 이상의 선
-
PHP 정규식(PCRE)의 모든 것 - 일회성 서브 패턴(Once-only subpatterns)
Once-only subpatterns (단일 서브 패턴) 반복을 최대/최소화하면서 일치가 실패하면 반복되는 항목을 재평가하여 다른 반복 횟수로 나머지 패턴을 일치시킬 수 있는지 확인한다. 때로는 패턴의 작성자가 반복적인 일치를 수행 할 필요가 없음을 알 때는 이를 방지하거나 일치 성질을 변경하거나 다른 방법보다 먼저 실패하게하는 것이 유용하다. 예를 들어, 문자열 "123456bar"에 \d+foo 패턴을 적용하는 것을 고려해 보자. 6자리 모두를 일치한 다음 "foo"와 일치하지 않으면, 정규식의 정상적인 동작은 \d+ 항목과
-
PHP 정규식(PCRE)의 모든 것 - 어설션(Assertions)
Assertions (어설션, 단정) 어설션은 실제로 어떤 문자도 사용하지 않고 현재 일치 지점의 앞/뒤 문자에 대한 테스트이다. \b, \B, \A, \Z, \z, ^ 및 $로 코딩된 간단한 어설션은 앞서 설명했다. 더 복잡한 어서션은 서브 패턴으로 코딩 된다. 이 어설션은 대상 문자열의 현재 위치보다 앞을 검사하는 look-ahead와 뒤를 검사하는 look-behind 두 가지 종류가 있다. 어설션 서브 패턴은 현재 일치하는 위치가 변경되지 않는다는 점을 제외하면 일반적인 방법으로 일치한다. Look-ahead 어설션은 (?=
-
PHP 정규식(PCRE)의 모든 것 - 역 참조(Back references)
Back references (역 참조) 캐릭터 클래스 밖에서 백 슬래시 다음에 0 보다 큰 숫자는 패턴에서 이전(즉, 왼쪽으로) 캡처 서브 패턴에 대한 역 참조다(주어진 수보다 캡처된 서브 패턴의 수가 같거나 더 많을 경우). 그러나 백 슬래시 뒤의 10진수가 10 보다 작은 경우에는 항상 역 참조로 사용되며 전체 패턴에 많은 왼쪽 여는 괄호(()가 없는 경우에만 오류가 발생한다. 즉, 참조된 괄호는 10 보다 작은 숫자의 참조 왼쪽에 있을 필요는 없다. "전방 참조"는 반복이 관련되어 있고 오른쪽의 서브 패턴이 이전 반복에 참여
-
PHP 정규식(PCRE)의 모든 것 - 반복(Repetition)
Repetition (반복) 반복은 다음 항목 중 하나를 따를 수 있는 한정 기호로 지정된다. 이스케이프 가능한 단일 문자 . 메타 문자 캐릭터 클래스 back reference(역 참조) 어설션이 아닌 괄호로 묶인 서브 패턴 일반적으로 반복 수량어는 괄호({}) 안에 쉼표로 구분된 두 개의 숫자를 입력하여 허용되는 일치의 최소 및 최대 수를 지정한다. 숫자는 65536 보다 작아야 하며 첫 번째 숫자는 두 번째 숫자보다 작거나 같아야 한다. 예를 들어, z{2,4}는 "zz", "zzz" 또는 "zzzz"와 일치한다. 단독으로 닫
-
PHP 정규식(PCRE)의 모든 것 - 서브 패턴(Subpatterns)
Subpatterns (서브 패턴) 서브 패턴은 둥근 괄호(())로 구분되며 중첩 될 수 있다. 패턴의 일부를 서브 패턴으로 표시하는 것은 다음 두 가지를 수행한다. 선택 집합을 지역화 한다. 예를 들어 cat(aract|erpillar|) 패턴은 "cat", "cataract" 또는 "caterpillar" 중 하나와 일치한다. 괄호가 없으면 "cataract", "erpillar" 또는 빈 문자열과 일치한다. 서브 패턴을 캡처 서브 패턴으로 설정한다. 모든 패턴이 일치하면 서브 패턴과 일치하는 문자열의 부분은 pcre_exec(
-
PHP 정규식(PCRE)의 모든 것 - 내부 옵션 설정(Internal option setting)
Internal option setting (내부 옵션 설정) PHP 정규표현식 패턴에 존재하는 변경자와 유사하게 사용되나 사용 위치가 다르다. PCRE_CASELESS, PCRE_MULTILINE,PCRE_DOTALL, PCRE_UNGREEDY, PCRE_EXTRA, PCRE_EXTENDED 및 PCRE_DUPNAMES의 설정은 "(?" 및 ")"로 묶인 Perl 옵션 문자 시퀀스에 의해 패턴 내에서 변경할 수 있다. 옵션 문자는 다음과 같다. Internal option letters(내부 옵션 문자) 옵션 설명 i PCRE_C
-
PHP 정규식(PCRE)의 모든 것 - 선택(Alternation)
Alternation (선택) 수직 막대 문자(|)는 선택 패턴을 분리하는데 사용된다(논리 연산의 or과 동일하게 생각하면 된다). 예를 들어, gilbert|sullivan 패턴은 "gilbert" 또는 "sullivan"과 일치한다. 임의의 수의 선택 패턴이 나타날 수 있으며 빈 선택 패턴을 허용한다(빈 문자열과 일치). 일치 여부에 대한 프로세스는 왼쪽에서 오른쪽으로 각 선택 패턴을 차례로 시도하고 성공한 첫 번째가 사용된다. 선택 패턴이 서브 패턴 내에 있는 경우 "성공"은 나머지 기본 패턴과 서브 패턴의 선택을 일치시키는
-
PHP 정규식(PCRE)의 모든 것 - 캐릭터 클래스(Character classes)
Character classes (캐릭터 클래스) 캐릭터 클래스는 여는 대괄호([)와 닫는 대괄호(])로 영역을 선언한다. 닫는 대괄호는 그 자체만으로는 특별한 의미를 가지지 않는다. 닫는 대괄호가 클래스의 멤버로 필요하면 클래스의 첫 번째 데이터 문자(곡절 부호(^)로 시작하는 경우) 뒤에 있거나 백 슬래시로 이스케이프되어야 한다. 캐릭터 클래스는 문장의 단일 문자와 일치한다(단어가 아닌 단일 문자 단위로 일치한다). 캐릭터 클래스의 첫 번째 문자가 곡절 부호(^)가 아닌 경우 캐릭터 클래스에 정의된 문자 세트가 있으면 일치한다.
-
PHP 정규식(PCRE)의 모든 것 - 마침표(Dot)
Dot (마침표 문자) 캐릭터 클래스 밖에서도 패턴의 마침표(.)는 임의의 한 문자와 일치한다. 기본적으로 비인쇄 문자는 포함하지만 개행 문자(줄바꿈)는 포함되지 않는다. PCRE_DOTALL 옵션이 설정되면 마침표는 줄바꿈과도 일치한다. 마침표의 처리는 "^"와 "$"의 처리와는 완전히 독립적이다. 유일한 관계는 둘 다 개행 문자를 포함한다는 것이다. 마침표는 캐릭터 클래스에서 특별한 의미가 없다. \C를 사용하여 1 바이트를 일치시킬 수 있다. UTF-8 모드(u)에서는 마침표가 멀티 바이트로 구성 될 수 있는 전체 문자와 일치
-
PHP 정규식(PCRE)의 모든 것 - 앵커(Anchors)
Anchors (앵커) 곡절 부호(^) 캐릭터 클래스 외부의 기본 일치 모드에서 곡절 부호(^)는 현재 일치하는 점이 제목 문자열의 시작 부분에 있는 경우에만 참(true)인 어설션이다. 캐릭터 클래스 내에서 곡절 부호(^)는 완전히 다른 의미를 지닌다. 여러 가지 선택이 포함되어 있는 경우 곡절 부호(^)는 패턴의 첫 번째 문자일 필요는 없지만 패턴이 해당 분기와 일치하는 경우 나타나는 각 대체 방법의 첫 번째 문자여야 한다. 가능한 모든 선택이 곡절 부호(^)로 시작하는 경우, 즉 패턴이 문장 시작 부분에서만 일치하도록 제한되면
-
PHP 정규식(PCRE)의 모든 것 - 유니코드 문자 속성(Unicode character properties)
Unicode character properties (유니코드 문자 속성) PHP 5.1.0 이후부터 UTF-8 모드가 선택되면 일반 문자 유형과 일치하는 세 개의 추가 이스케이프 시퀀스를 사용할 수 있다. 문자 설명 \p{xx} xx 속성을 가지는 문자 \P{xx} xx 속성을 가지지 않는 문자 \X 확장 유니코드 시퀀스 위의 xx로 표시된 속성 이름은 유니코드 일반 범주 속성으로 제한된다. 각 문자에는 정확히 두 개의 문자로 된 약어가 지정된다. Perl과의 호환성을 위해 여는 중괄호({)와 속성 이름 사이에 곡절 부호(^)를
-
PHP 정규식(PCRE)의 모든 것 - Escape sequences
Escape sequences 백 슬래시 문자는 여러 용도로 사용된다. 첫 번째, 영숫자가 아닌 문자가 나오면 문자가 가질 수 있는 특별한 의미가 없어진다. 이스케이프 문자로 백 슬래시를 사용하면 캐릭터 클래스의 내부 및 외부에 모두 적용된다. 예를 들어, "*" 문자를 일치시키려면 패턴에 "\*"을 쓴다. 이것은 \ 다음 문자가 메타 문자로 해석될지 여부와 관계없이 적용되므로 영숫자가 아닌 문자 앞에 "\"를 붙이면 문자 자체를 의미하는 것으로 항상 안전하다. 단, 백 슬래시와 일치시키려면 "\\"이라고 써야 한다. ' 또는 "
-
PHP 정규식(PCRE)의 모든 것 - 메타문자(Meta-characters)
Meta-characters (메타 문자) 정규식은 선택과 반복을 포함 할 수 있어 강력하다. 이것들은 메타 문자의 사용에 의해 패턴으로 인코딩된다. 메타 문자는 의미를 가지지 않고 대신에 특별한 방식으로 해석된다. 대괄호([]) 안에 있는 것을 제외하고는 패턴의 어디에서나 인식되는 메타 문자와 대괄호 내에서 인식되는 메타 문자의 두 가지가 있다. 대괄호 바깥에 있는 메타 문자는 다음과 같다. 문자 설명 \ 일반적인 이스케이프 문자 ^ 문장(또는 여러 줄 모드의 줄)의 시작을 선언 $ 문장(또는 여러 줄 모드의 줄)의 끝을 선언 .
-
PHP 정규식(PCRE)의 모든 것 - 구분기호(Delimiters)
Delimiters (구분 기호) PCRE를 사용할 때 정규식 패턴은 Delimiters(구분 기호)로 묶여 있어야 한다. 구분 기호는 영숫자, 백 슬래시(\), 공백이 아닌 문자여야 한다. 자주 사용되는 구분 기호는 슬래시(/), 해쉬 기호(#) 및 물결표(~)다. /foo bar/ #^[^0-9]$# +php+ %[a-zA-Z0-9_-]% 구분 기호가 패턴 내부에서 일치해야 하는 경우 백 슬래시(\)를 사용하여 이스케이프 해야 한다. 구분 기호가 패턴 내부에 자주 나타나면 가독성을 높이기 위해 다른 구분 기호를 선택하는 것이 좋
-
PHP 정규식(PCRE)의 모든 것 - 프롤로그
정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp 또는 regex) 또는 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. - 위키백과 정규식은 프로그래밍에서 필수는 아니지만 알아두면 아주 유용하게 사용하게 된다. 그런데 이 정규식이 그리 만만하지만은 않다. 기본적인 용법만 활용 한다면 크게 어렵지는 않지만 복잡한 패턴을 적용하려고 하면 상당히 어려워진다. 이 글은 PHP 메뉴얼에 설명된 PCRE(Perl Compatible Regular Expressi
-
PHP(PCRE) 정규표현식 패턴에 존재하는 변경자
PHP에서 PCRE(Perl Compatible Regular Expressions) 정규식을 사용하다 보면 패턴 변경자를 자주 이용하게 되는데 이 부분이 항상 헛갈려서 관련 내용을 남겨 둔다. 그리고 유사하지만 서브 패턴 내에서 사용할 수 있는 Internal option setting도 있으니 참고하면 도움이 된다. 주로 사용하게 되는 변경자 몇가지를 간단히 소개하자면 다음과 같다. i : 대소문자 구분을 하지 않음 m : 검사 대상이 여러줄로 이루어져 있을 경우 "\n" 문자를 기준으로 분리하여 각각의 줄로 패턴을 검사한다(^
-
Max OSX에 PHP (5.3 ~ 7.1) 바이너리 패키지 설치
대부분의 PHP 작업은 vagrant를 사용해서 linux에서 한다. 하지만 경우에 따라 OSX에서도 PHP 실행이 필요하다. 이럴때 주로 사용하는 PHP 버전과 OSX에서 제공하는 PHP의 버전이 다를 경우 다소 불편해서 가급적 버전을 맞추어 사용한다. 이런 상황에서 유용한 것이 PHP 5.3 to 7.1 for OS X / macOS 10.6 to 10.12 as binary package에서 제공하는 바이너리 패키지이다. 쉘 스크립트 한줄로 원하는 PHP 버전을 설치해 준다(/usr/local/php5에 설치한다). 이 패키지
-
PHP 한글 slug
"슬러그(Slug)란?" 글을 보면 slug에 대해 잘 설명되어 있다. PHP로 작업 중 한글로 된 이름을 URL에서 사용하기에 적합한 slug로 변환하는 것이 필요해 몇가지 자료를 참고해서 간단히 작성했다(짜집기). 간단하게 사용하려고 만든 것이다 보니 충분한 테스트가 된 코드는 아니다. 따라서 처리 과정에 대한 참고 자료로 활용하길 바란다(크게 중요한 부분이 아니라면 그대로 가져다 써도 큰 문제는 없을 듯하다). <?php class Hangul { static public function slug($str, $options =
-
PHP에서 NFD(Normalization Form D) / NFC(Normalization Form C) 변환
Mac OSX는 경우 문자열을 Unicode Normalization Forms 중 NFD(소리 마디를 첫가끝 코드로 분해)로 처리한다(일반적으로는 NFC(첫가끝 코드를 소리 마디로 결합)를 사용). 이는 한글(U+AC00) 영역을 사용하는 곳에서는 한글이 모두 풀어진 상태로 보이는 문제가 있다. 따라서 U+1100 영역을 U+AC00 영역으로 변환하는 과정이 필요하다. 한글 인코딩의 이해 2편: 유니코드와 Java를 이용한 한글 처리에서는 유니코드 정규화(Unicode equivalence)를 아래와 같이 소개하고 있다. 한글 소
-
PHP 삼항 연산자 : Ternary Operator 와 Null Coalesce Operator
PHP에도 삼항 연산자:Ternary operator 가 있다. 메뉴얼에는 아래와 같이 설명되어 있다. <?php // 사용 예제: 삼항 연산자 $action = (empty($_POST['action'])) ? 'default' : $_POST['action']; // 위 예제는 다음의 if/else 구문과 동일합니다 if (empty($_POST['action'])) { $action = 'default'; } else { $action = $_POST['action']; } (expr1) ? (expr2) : (expr3) 표
-
PHP Composer : Private Repository / Proxy / 속도 향상(Toran Proxy를 사용한)
오늘은 Composer에서 Packagist가 아닌 private repository를 사용할 수 있도록 Toran Proxy를 설정하는 방법을 설명하고자 한다. 사실 Toran Proxy 외에도 Satis라는 것도 있는데 관련된 내용은 Handling private packages with Satis or Toran Proxy을 참고하길 바란다(Satis를 조금 더 편하게 사용하기 위한 라이브러리들도 몇가지가 있다. 사실 Satis가 더 유명하나 Toran Proxy가 더 사용하기 편할 것 같아 선택했다). 본 설명에 앞서 Tor
-
php-fpm opcache로 인한 Nginx - 502 bad gateaway 오류
얼마 전부터 서비스 사용자로부터 이상한 오류 보고를 비주기적으로 받고 있다. 특정 페이지에 접속시 502 Bad gateaway 오류가 난다는 것이다. 하지만 그 오류가 나는 페이지에 특별히 눈에 띄는 부분은 없다. 게다가 동일한 프로그램이 몇개의 폴더에서 동시에 사용 중임에도 꼭 한군데서만 동일한 문제를 일으킨다. 게다가 일시적으로 발생하고 사라지지 않고 한번 오류가 발생하면 그 후에 해당 페이지에 접속하면 해결 전까지는 계속 502 에러를 보인다. 게다가 해당 오류가 발생하는 조건을 알 수 없어 오류 재연이 불가능한 상황이라 원
-
PHP - Invalid SOS parameters for sequential JPEG 오류 해결
PHP에서 GD를 이용해서 jpg 이미지를 처리할 때 아래와 같은 오류를 만날 수 있다. 나의 경우는 안드로이드에서 jpg 이미지를 PHP로 전송해서 처리하는 과정에서 이 오류를 만났다(안드로이드여 사라져라). Warning: imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: Invalid SOS parameters for sequential JPEG 이 오류는 PHP Bugs에 Bug #39918 imagecreatefromjpeg doesn't work라는 글로도 등록되어
-
PHP 7에서 Gearman 모듈 사용하기
PHP 7로 마이그레이션시에 걸림돌이 될 수 있는 것 중 하나가 PHP 모듈의 호환성 문제다. 나의 경우는 대부분 문제가 없었으나 Gearman이 걸렸다. 아직 Gearman의 PHP 모듈이 정식으로 PHP 7을 지원하지 않아서 공식 지원을 기다리고 있었다. 그런데 시간을 두고 기다려봐도 지원을 기대하기 어려워(버전업이 오래전부터 멈춰있음) 자체적으로 방법을 찾기로 했다. Gearman 외에도 PHP 7과 모듈들의 호환성을 확인하려면 PHP 7 Extensions을 참고하기 바란다. 우선 나의 경우는 PHP 7을 소스 설치하지 않고
-
php composer 속도 개선하기
Composer(컴포저)는 PHP의 의존성 관리도구이다. 이 Composer를 사용하면서 가장 큰 단점으로 꼽을 수 있는 것은 느린 속도다. 나만 그렇게 느끼는 것은 아닌지 국내외에 많은 이야기가 있다. 오늘은 그 이야기들을 정리해 보려고 한다. 우선 Composer에 대한 상세한 내용은 Composer 한국어 매뉴얼을 참고하면 도움이 될 것 같다. 그리고 Composer 속도에 관련된 참고글이다. composer.phar 의 동작이 느릴 때 조치할 수 있는 것들. 컴포저(PHP Composer) 속도 향상 시키기 그럼 하나씩 살펴
-
Mac OSX(10.6 – 10.11)에서 PHP(5.6 / 7) 업그레이드
현재 기준으로 El Capitan에서 PHP 버전은 5.5.30이다. 웬만한 PHP 라이브러리는 동작하는데 문제가 없는 버전이긴 하지만 PHP 7이 최신 버전이며 작업에 따라 더 높은 버전의 PHP가 필요할 수 있다. 나의 경우도 웬만한 작업은 Vagrant에서 하므로 OSX의 PHP 버전은 문제가 되지 않지만 이번에 몇가지를 테스트하기 위해 OSX의 PHP를 버전업 하기로 했다. OSX에서의 PHP 버전업은 Upgrade to PHP 5.6 or 7 on Mac OSX 10.11 El Capitan and OSX 10.6 – 10
-
PHP password_hash()와 BCrypt
Naver D2에 안전한 패스워드 저장이란 글을 보면 비밀번호 저장을 위한 해시 함수에 대한 소개를 하고 있다. 그 중에서 bcrypt에 대해서는 아래와 같이 설명하고 있다. bcrypt bcrypt는 애초부터 패스워드 저장을 목적으로 설계되었다. Niels Provos와 David Mazières가 1999년 발표했고 현재까지 사용되는 가장 강력한 해시 메커니즘 중 하나이다. bcrypt는 보안에 집착하기로 유명한 OpenBSD에서 기본 암호 인증 메커니즘으로 사용되고 있고 미래에 PBKDF2보다 더 경쟁력이 있다고 여겨진다. 실
-
PHP password_hash() salt option has been deprecated
php에서 비밀번호를 암호화해서 저장하기 위해서 password_hash()를 사용하고 있다. 다른 곳에서도 오래전에는 MD5, SHA1과 같은 hash 함수를 사용하는 경우들도 있었지만 요즘은 대부분 password_hash()을 사용하고 있을 것이라고 생각한다. 이번에 사용중이던 PHP를 7버전으로 버전업하려고 Vagrant에서 먼저 테스트 중이다. 이야기하려는 주제와는 맞지 않지만 PHP 7을 사용하는 것은 필수적인 선택이라고 생각한다. 실제로 테스트 해보니 실행 성능이 향상되며 메모리 사용량도 40% 가량 줄었다. 이 부분은
-
PHP CLI 사용자 입력(STDIN) 받기
PHP CLI를 사용해서 Shell Script를 생성하다보면 사용자에게 어떤 데이터를 입력 받아야 상황이 발생할 수 있다. 이런 경우에 사용할 수 있는 몇가지 방법에 대해 설명하고자 한다. 우선 PHP 메뉴얼 중 Input/output streams에 있는 예시에 약간의 코드를 더해서 설명하겠다. <?php $stdin = fopen('php://stdin', 'r'); $fileContents = fread($stdin, 1024); fclose($stdin); echo $fileContents; 우선 위 방법은 fopen을 사
-
composer 사용시 github token을 요구할 때
php composer를 사용해서 의존성 모듈을 설치하려고 할 때 아래와 같이 Token을 요구하는 경우가 있다. $ composer update Loading composer repositories with package information Cloning failed using an ssh key for authentication, enter your GitHub credentials to access private repos Head to https://github.com/settings/tokens/new?scopes=rep
-
selinux + PHP : Session Permission denied 오류
서버를 새로 세팅하면서 CentOS 7에서 selinux와 함께 PHP 5.6을 설치했다. 기존에는 selinux를 사용하지 않도록 했었는데 이번에는 사용하도록 설정해서 설치를 완료했다. 그런데 세션을 사용하려고 session_start();를 하면 아래와 유사한 오류가 발생했다. FastCGI sent in stderr: "PHP message: PHP Warning: session_start(): open(/var/lib/php/session/sess_sk456vdemnp391spiv3i622i96, O_RDWR) failed:
-
protobuf (Protocol Buffers)를 PHP에서 사용하기
Protocol Buffers는 무엇일까? 공식 사이트에서 아래와 같이 설명하고 있다. Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data. 간단히 말하면 언어와 플랫폼에 중립적이며 확장 가능한 구조화된 데이터 직렬화 도구라고 할 수 있겠다. XML과 유사하지만 더 작고, 더 빠르며, 더 단순하다고 소개하고 있다. 이번 글에서는 Protocol Buffers 자체에 대한 연구가 목적이 아
-
PHP를 CLI에서 사용시 ANSI Colors 적용하기
php를 CLI(shell 환경)에서 사용시 처리 과정을 확인하기 위한 로그나 결과를 echo 등을 사용해서 출력하는 방법을 사용할 것이다. 보통 shell script 작성시 python이나 bash script를 많이 사용하지만 php 프로그램과 연결된 작업을 해야 하거나 php가 손에 익어서 편할 경우 등 여러가지 이유로 php를 shell에서 사용하는 경우도 많다. 실제로 나는 가급적 프로세스 처리는 bash를 사용하고 간단한 작업은 python으로 하려고 하지만 php가 아무래도 손에 익은지라 조금 복잡한 작업은 php 프
-
PHP의 DateTime을 Java (Android)로 전달하기
안드로이드 앱을 개발하게되면 많은 경우에 서버와의 데이터 연결이 필요하다. 대부분의 데이터 타입은 이 과정에서 큰 문제를 일으키지 않는다(데이터 타입만 명확히 한다면). 하지만 DateTime은 조금 까다로울 수 있다. 프로그램에서 시간은 TimeZone을 가지고 있기 때문에 이 부분을 명확히 하지 않으면 의도치 않은 시간으로 표시된다. 게다가 형식이 맞지 않는다면 제대로 전달되지 않을 수도 있다. 네이버 D2에 있는 Java의 날짜와 시간 API를 보면 Java에서의 Date 처리가 불편하다는 얘기가 있다. 이번 작업에서는 서버는
-
PHP에서 soundex / metaphone key 구하기
앞선 포스팅에서 levenshtein() 함수, similar_text()에 대해 알아보았다. 이런 문자열 비교 함수는 아니지만 문자열의 soundex key를 구하여 발음이 유사한 단어들을 찾을 수 있도록 도와주는 soundex() 함수와 이보다 더 정확한 결과를 반환한다고 하는 metaphone() 함수에 대해서 알아보자. soundex란? Soundex란 발음이 유사한 서로다른 철자의 단어를 그룹화하여 철자 입력 오류를 보정하기 위한 색인시스템으로 초기에는 주로 사람이름을 검색하기 위한 용도로 사용되었으나 인터넷 검색이 활성화
-
PHP에서 두 문자열의 거리(유사도) 구하기 - similar_text()
앞선 포스팅 PHP에서 두 문자열의 거리(유사도) 구하기 - levenshtein()에서 levenshtein() 함수에 대해 알아보았다. 이번엔 이와 유사한 함수인 similar_text()에 대해 알아보고자 한다. similar_text() 함수 php 메뉴얼의 설명에 따르면 similar_text() 함수는 두 문자열의 유사도를 계산한다고 되어 있다. 두 문자열의 유사도를 이 계산은 Programming Classics: Implementing the World's Best Algorithms by Oliver (ISBN 0-
-
PHP에서 두 문자열의 거리(유사도) 구하기 - levenshtein()
php 프로그램 개발중 문자열의 유사도를 계산해야 할 일이 생겼다. 그래서 찾다보니 php 내장 함수에 해당 기능이 이미 구현되어 있었다. 비슷한 함수가 몇가지 존재하고 있어서 조금 더 자세히 알아 보았다. levenshtein() 함수 위키피디아에 Levenshtein distance에 대한 상세한 설명이 나와있다. php 메뉴얼의 설명에 따르면 Levenshtein distance는 문자열1을 문자열2로 변환하는데 필요한 최소한의 치환, 추가, 삭제의 횟수를 나타낸다고 되어 있다. 이 알고리즘의 시간복잡도는 O(m*n)이며, 여
-
두지점(WGS84 좌표)간 km 거리 계산 함수(php, mysql, javascript)
WGS84 좌표계는 위키피디아에 따르면 다음과 같다. World Geodetic System (WGS) 1984년에 제정된 범 지구적 측위 시스템으로 지도학, 측지학, 항법에 많이 사용된다. 통칭 및 약칭은 WGS 84 (aka WGS 1984, EPSG:4326, WGS84)라고 부르며, 2004년에 마지막으로 개정되었다. 이전에 쓰던 초안으로 WGS 72, WGS 66, 그리고 WGS 60이 있다. 기존에는 네이버 지도 등에서 KTM 좌표를 사용하기도 했지만 요즘엔 WGS84 좌표를 주로 사용한다. 이번에 작업을 하면서 WGS8
-
htmlspecialchars_decode와 html_entity_decode의 문자열 처리의 다른 점
php에서 html 구문을 그대로 출력하기 위해 htmlspecialchars를 사용한다. 반대로 출력된 문장(Special HTML entities)을 되돌리기 위해서는 일반적으로 htmlspecialchars_decode를 많이 사용한다. 그런데 이 함수를 사용하는데 문제가 있다. htmlspecialchars_decode는 를 공백으로 다시 되돌려 주지 않는다. 다시 htmlspecialchars로 돌아가서 메뉴얼을 보면 아래와 같이 변환된다고 설명되어 있다. '&'(앰퍼샌드)는 '&'가 됩니다 '"'(겹따옴
-
PHP에서 Byte-escaped(\xFF)된 문자열 decode하기
어제 회사 직원 한명이 협력사에서 데이터 전달을 위해 생성해서 알려준 URL에서 데이터를 받지 못해 고생을 하고 있었다. 협력사는 PC용 어플리케이션을 만드는 회사(Delphi 사용)로 웹에 대해서 잘 모른다. 처리하고자 하는 일은 다음과 같았다. PC용 어플리케이션에서 버튼을 누르면 해당 어플리케이션에서 가지고 있던 데이터를 특정 URL로 호출(전달)해주는 것이었다. 처음엔 데이터를 "뭐뭐 주세요" 했더니 그냥 넘겨주는 바람에 특수문자가 들어가 내용이 정상적으로 전달되지 않았다. 당연히 POST 방식으로 값을 전달해주면 문제가 없
-
phpstorm8 phpunit 설치
phpstorm8 phpunit 세팅법 PHPStorm preferences > php > phpunit > + > By remote interpreter remote server 추가 : ssh로 접속 설정 path to phpunit.phar 선택 > path to phpunit.phar : /czdev/vagrant/work/phpunit.phar Default configuration file : /home/web/makeus/CZFramework/tests/phpunit.xml Default bootstrap file :