HTTPS 설정이 된 서버에서

제트스트림 로그인 시 HTTP로 넘어가서 로그인이 되지 않을 때

 

app/Providers/AppServiceProvider.php 파일에 아래 코드 추가

 

public function boot()
 {
    if (!App::environment('local')) {
        resolve(\Illuminate\Routing\UrlGenerator::class)->forceScheme('https'); 
    }
 }
 
 
 

 

PHP 에 오토로딩 기능이 포함되었지만 app 개발자는 오토로딩할 클래스를 직접 spl_autoload_register 를 사용하여 일일이 등록해야 하는 번거로움이 있습니다. 

 

컴포저는 사용할 패키지나 클래스가 있을 경우 간단하게 패키지명만 기술하면 자동으로 로딩해 주는 아주 편리하고 훌륭한 기능을 제공하고 있습니다.

이 책에서는 자동으로 클래스나 인터페이스를 로딩해 주는 것을 오토로딩으로 부르며 오토로딩을 수행하는 로더(Loader)를 오토로더(Auto Loader) 라고 호칭합니다.

 

만약 컴포저를 사용할 수 없는 오래된 프레임워크에서 외부 라이브러리를 사용하고 할 경우 매우 불편하고 귀찮은 작업을 수행해야 합니다.

 

파일 시스템을 추상화하여 로컬 파일이든 드랍박스에 저장된 파일이든 혹은 아마존 클라우드에 저장된 파일이든  단일한 인터페이스로 손쉽게 다룰 수 있는 유명한 라이브러리인 league/flysystem 패키지(라라벨 5에는 기본 탑재되어 있습니다.)를 프로젝트에서 사용한다고 가정해 봅시다.

 

만약 컴포저를 사용할수 없는 환경이라면 이 패키지를 사용하기 위해서는 다음과 같이 spl_autoload_register 함수에 패키지를 등록해야  사용할 수 있습니다.

spl_autoload_register(function($class) {

    $prefix = 'League\\Flysystem\\';

 

    if ( ! substr($class, 0, 17) === $prefix) {

        return;

    }

 

    $class = substr($class, strlen($prefix));

    $location = __DIR__ . 'path/to/flysystem/src/' . str_replace('\\', '/', $class) . '.php';

 

    if (is_file($location)) {

        require_once($location);

    }

});

 

하지만 컴포저를 사용한다면 composer require league/flysystem 명령을 콘솔에서 실행하거나 다음과 같이 composer.json  require 항목에 의존성을 기술하고 composer update 를 실행하면 오토로더가 생성됩니다.

"require": {

        "monolog/monolog": "^1.13",

        "nesbot/carbon": "^1.19",

        "league/flysystem": "^1.0"

 },

 

오토로더는 classmap 과 psr-4 두 가지 방식을 사용할 수 있습니다. 다음은 composer.json 에 현재 프로젝트내 database 폴더는 classmap 방식의 오토로더를 사용하고 app 폴더는 App 라는 네임스페이스를 쓰는 psr-4 방식의 오토로더를 사용하겠다는 의미로 라라벨 5의 기본 설정입니다.

이제 클래스맵과 psr-4 방식의 차이점에 대해서 알아보도록 하겠습니다.

"autoload": {

    "classmap": [

            "database"

    ],

    "psr-4": {

            "App\\": "app/"

    }

},

 

클래스맵 방식의 오토로더로 설정할 경우 클래스맵에 지정된 폴더내에 모든 php 를 읽어서 다음과 같은 정적 배열을 생성하고 이 파일들을 오토 로딩합니다.

<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));

$baseDir = dirname($vendorDir);

return array(

    'App\\Commands\\Command' => $baseDir . '/app/Commands/Command.php',

    'App\\Commands\\SeedMakeCommand' => $baseDir . '/app/Commands/SeedMakeCommand.php',

    'App\\Console\\Commands\\Inspire' => $baseDir . '/app/Console/Commands/Inspire.php',

    'App\\Console\\Kernel' => $baseDir . '/app/Console/Kernel.php',

정보를 정적으로 생성후 로딩하므로 클래스맵은 런타임에 처리 속도가 psr-4 보다 빠르지만 새로운 파일이나 폴더가 추가되면 컴포저에게 오토로딩 정보를 갱신해야 한다고 알려줘야 합니다. 이 명령어는 dump-autoload 또는 dumpautoload 명령어이며 vendor/autoload.php 에 새로운 클래스맵 오토로더를 생성합니다.

$ composer dump-autoload

 

psr-4 방식의 오토로더는 다음과 같이 네임스페이스와 이를 매칭시킬 디렉토리만 지정하게 되며 동적으로 런타임에 요청한 클래스나 인터페이스, 트레이트를 찾게 됩니다.

<?php

  

$vendorDir = dirname(dirname(__FILE__));

$baseDir = dirname($vendorDir);

return array(

    'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),

    'League\\Flysystem\\' => array($vendorDir . '/league/flysystem/src'),

유명한 로그 라이브러리인 Monolog 패키지는 Monolog 네임스페이스가  vendor/monolog/monolog/src/Monolog 에 매핑되어 있습니다.

 

다음과 같이 Monolog 의 Logger  Handler\StreamHandler 클래스를 사용하는 소스가 있습니다.

<?php

include "vendor/autoload.php";

  

use Monolog\Logger;

use Monolog\Handler\StreamHandler;

  

$log = new Logger('loggerName');

psr-4 방식의 오토로더는 vendor/monolog/monolog/src/Monolog 폴더내에서 네임스페이스를 기준으로 다음 경로에서 use 로 지정된 php 파일을 찾게 됩니다.

  • vendor/monolog/monolog/src/Monolog/Logger.php
  • vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php

 

이렇게 psr-4는 use 지정된 클래스나 인터페이스에 따라 런타임에 동적으로 로딩하므로 클래스나 인터페이스가 추가되어도 새로 컴포저에게 알려주지 않아도 되므로 매우 유용하지만 클래스맵보다 속도가 느린 단점이 있습니다.

 

그러므로 개발 환경에서는 psr-4 를 사용하고 운영 환경은 클래스맵을 사용하는 것이 개발의 편의성 및 운영시 속도를 향상 시킬 수 있는 좋은 방법이며 컴포저는 이를 위해서 dump-autoload 명령어에 -o 옵션을 제공하고 있습니다.

운영 환경에서 다음 명령어를 실행할 경우 psr-0, psr-4 방식의 오토 로더를 클래스맵으로 덤프해 주므로 런타임에 클래스를 파일 시스템에서 찾지 않으므로 더욱 빠른 웹 서비스를 제공할 수 있습니다.

$ composer dump-autoload  -o

Ref

출처 : https://www.lesstif.com/pages/viewpage.action?pageId=24445513

1. redis(레디스)가 뭔가요? 많이 들어는 봤는데…..

레디스(REmote DIctionary Server) 는 메모리기반 key-value store(저장소) 입니다. 

redis 는 주로 두가지 용도로 많이 습니다.

1. 데이타(또는 페이지) 캐시

2. 세션 저장소 

세션 저장소로 사용할 경우 대용량 분산처리가 가능하며, 서브도메인 세션공유를 쉽게 처리할수 있습니다.

2. redis 설치 및 시작

   2.1 centos6.x 에서 redis 설치 (centos7 도 동일)

[root@vultr ~]# yum install redis
.....
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : redis-3.2.11-1.el6.x86_64                                                                                                  1/1
  Verifying  : redis-3.2.11-1.el6.x86_64                                                                                                  1/1
 
Installed:
  redis.x86_64 0:3.2.11-1.el6
 
Complete!
[root@vultr ~]#
#기본실행 서비스에 등록해둡니다.
[root@vultr ~]# chkconfig redis on
[root@vultr ~]# service redis start
Starting redis-server: [ OK ]
 
# redis-cli 로 정상 접속되는지 확인합니다.
[root@vultr ~]#
[root@vultr ~]# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> quit
[root@vultr ~]#

2.2 ubuntu 에서 설치

root@vultr:~# sudo apt-get install redis-server
Suggested packages:
  ruby-redis
Do you want to continue? [Y/n] y
root@vultr:~# 
#redis-server를 자동실행 서비스에 등록한다.
root@vultr:~# sudo apt-get install sysv-rc-conf
root@vultr:~# sysv-rc-conf redis-server on
 
root@vultr:~# redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> quit
root@vultr:~#

3. phpredis 설치

PHP 에서 redis 를 사용하기 위해서는 phpredis 라는 php 모듈이 필요합니다. 모듈을 컴파일해서 설치해야합니다. 어렵지 않음으로 순서만 잘 이해하면 됩니다.

먼저 php설치정보를 확인해야 합니다. php -i  나 웹페이지에서 phpinfo() 를 확인합니다.

화면에서 php.ini 의 설치위치를 잘봐둡니다. 제 서버는 /usr/local/php/etc/php.ini 에 위치하고 있네요.

phpredis 를 다운받아 컴파일 해야 합니다. 컴파일 순서는 아래와 같습니다.

  1. phpredis 최신 버전을 다운받습니다. git 을 통해 받거나, wget 으로 받으시면 됩니다.
  2. 다운받은 파일을 압축을 해제한다음, 디렉토리로 이동합니다.
  3. phpize 를 실행해줍니다. phpize 를 찾이못한다면, 풀경로로 실행합니다.
  4. configure 를 실행합니다. 이때 php 가 설치된 php-config 정보를 넣어줍니다.
  5. make, make install 을 실행해줍니다.
[root@vultr ~]# wget https://github.com/nicolasff/phpredis/zipball/master -O phpredis.zip
Saving to: “phpredis.zip”
[root@vultr ~]# unzip phpredis.zip
[root@vultr ~]# ll
total 228
drwxr-xr-x 5 root root   4096 Sep 27 14:59 phpredis-phpredis-24e7859
-rw-r--r-- 1 root root 224711 Nov  9 21:45 phpredis.zip
[root@vultr ~]#
[root@vultr ~]# cd phpredis-phpredis-24e7859/
[root@vultr phpredis-phpredis-24e7859]# phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[root@vultr phpredis-phpredis-24e7859]#
#만약 phpize 를 못 찾는다면 # /usr/local/php/bin/phpize 처럼 전체 경로로 실행
#configure 실행
 
[root@vultr phpredis-phpredis-24e7859]# ./configure --with-php-config=/usr/local/php/bin/php-config
......
creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h
[root@vultr phpredis-phpredis-24e7859]#
 
#컴파일
[root@vultr phpredis-phpredis-24e7859]# make
...
Build complete.
Don't forget to run 'make test'.
[root@vultr phpredis-phpredis-24e7859]# 
[root@vultr phpredis-phpredis-24e7859]# make install
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
[root@vultr phpredis-phpredis-24e7859]#

위에서 make install 후 출력되는 경로를 잘 확인해두어야 합니다. 나중에  php.ini 에 추가할 예정

 /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

php.ini 파일을 수정해 주어야 합니다. php.ini 파일 위치는 아까 phpinfo()에서 확인하였습니다. php.ini 파일을 열어서 마지막에 아래 라인을 추가해줍니다. 저장후 php-fpm 을 재시작하고 다시 phpinfo()를 보시면 php에 redis 모듈이 표시되는걸 확인할수 있습니다. 세션 정보도 redis 로 변경합니다.

[redis]
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/redis.so
session.save_handler = redis
session.save_path = “tcp://127.0.0.1:6379”

[root@vultr phpredis-phpredis-24e7859]# vi /usr/local/php/etc/php.ini
 
[redis]
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/redis.so
session.save_handler = redis
session.save_path    = "tcp://127.0.0.1:6379"
:wq
 
[root@vultr phpredis-phpredis-24e7859]# php -i | grep redis
redis
Registered save handlers => files user redis rediscluster
session.save_handler => redis => redis
PWD => /root/phpredis-phpredis-24e7859
_SERVER["PWD"] => /root/phpredis-phpredis-24e7859
This program is free software; you can redistribute it and/or modify
[root@vultr phpredis-phpredis-24e7859]#

4. 마지막으로 php로 redis 테스트

<?php
$redis_host = "127.0.0.1";
$redis_port = 6379;
echo "<h1>redis 테스트<h1><br/>";
try {
    $redis = new Redis();
    $redis->connect($redis_host, $redis_port, 1000);
    $key = "mytest:first_key:incr_test"; //키분류는 :(콜론)을 찍는게 일반적
    $value = $redis->get($key);
    echo "value : ".$value."<br>";
    $redis->incr($key); //테스트를 위해 값증가
    $redis->expire($key, 3); //3초만 유지함.
} catch(Exception $e) {
    die($e->getMessage());
}
?>

해당 소스를 저장후 웹페이지서 테스트를 하면, 처음 value가 없다가 새로고침 할때마다 1씩 증가합니다. 3초간 기다렸다가 다시 새로고침하면, 초기화 되는걸 볼수 있습니다.

phpredis 의 자세한 사용법은 https://github.com/phpredis/phpredis  를 참고하세요.

 

 

5. 끝으로..

그누보드5 (영카트) 에서 사용할때 주의점

그누보드5의 common.php 에는 session 설정과 관련된 코드가 들어 있습니다. redis 를 session 저장소로 사용하는 경우 session.save_path 를 수정하면 안됩니다.  /common.php 파일 190번 라인에 있는 아래 코드를 주석 처리 합니다.

//session_save_path(G5_SESSION_PATH);

 

 

출처 : http://blog.bongwork.com/archives/44

// 전체 키를 가져옴 [ return : data ]
$returnData = $redis_select->keys('*'); 
print_r($returnData);

// 키에대한 값을 가져옴 [ return : data ]
$returnData = $redis_select->get($test[0]);

// 해시에 대한 전체 값을 가져옴 [ return : data ]
$returnData = $redis_select->hgetall('all_contents');

// 해시에 대한 값을 가져옴 [ return : data ]
$returnData = $redis_select->hget('TESTHASH', {$key});

// 해당 해시에 대한 키를 가져옴 [ return : data ]
$returnData = $redis_select->hkeys('TESTHASH');

// 해시 등록[ return : true/false ]	( 기존에 있는 키값이라면 덮어씌우고 false 떨굼 )
$saveData = serialize(array("a","b","c");
$returnData = $redis->hset('TESTHASH', "key", $saveData);

// 해당 해시 삭제 [ return : true/false ]
$returnData = $redis->hdel('TESTHASH',$userResetSeq);			

// 커넥션종료
$redis_select->disconnect();	

HTML5에서는 해당 요소에서 사용자가 임의로 지정한 속성값을 활용할 수 있으며, 이를 Custom Data Attribute 라고 부른다.

이처럼 ‘data-‘를 앞에 붙여서 속성명을 지정하고 값을 부여하면 된다. 단 이때, 속성명에 대문자를 입력하면 자동으로 소문자로 변환되기 때문에, 기본적으로 소문자를 사용할 것이 권장된다. 아니, 소문자를 써야한다.

제이쿼리에서는 data() 함수를 이용하여, data 속성의 값을 출력하거나, data 속성의 값을 지정할 수 있다.

해당 data 속성을 지우기 위해서는 removeData 이용하여 제거할 수 있다.

간혹 데이터함수가 적용이 잘 안될때가 있다. attr 을 이용하여 처리할 수 있는 경우가 존재한다.

 

출처 : http://syasidev.com/?p=607

'프로그래밍 > php' 카테고리의 다른 글

[PHP] Predis 설치  (0) 2019.05.22
[PHP] Predis 사용법  (0) 2019.05.22
[php]파일을 문자열로 읽기.  (0) 2018.03.08
PHP Simple HTML DOM Parser  (0) 2018.02.27
정규식 예제  (0) 2018.02.27

1. 원하는 크기만큼 (현재 :1000byte )읽는 방법
: 크기를 지정했기 때문에 딱 그만큼만 읽습니다. 
- 문자열이 그보다 작다면 다 읽을 것이요, 크면 짤릴 것이오~

$fp = fopen("document.txt","r");
$fr = fread($fp,1000);
fclose($fp);
echo $fr;

2. 1번보다는 유동적으로 사이즈크기를 통해 읽는 방법
: 딱 해당 파일의 문자열 크기만큼 읽기 때문에 좋은 방법입니다.

$fp = fopen("document.txt","r");
$fr = fread($fp, filesize("document.txt"));
fclose($fp);
echo $fr;

3. 한 글자씩 읽는 방법
: fgetc() 함수를 통해 한 글자씩 읽습니다.


$fp = fopen("document.txt","r");
while( !feof($fp) )
fclose($fp);
echo $doc_data;


4. 한 라인씩 읽는 방법
fgets() 함수를 통해 한 라인씩 읽습니다. 


$fp = fopen("document.txt","r");
while( !feof($fp) )
    $doc_data = fgets($fp);
fclose($fp);
echo $doc_data;


5. implode 함수를 사용해서 읽는 방법

implode함수는 주어진 배열을 문자열로 반환해주는 함수입니다.

string implode ( array $pieces )
string implode ( string $glue , array $pieces 

저희는 연결문자($glue)를 공백으로 했기때문에 공백없이 그대로~  문자열로 반환합니다. 
+ 정반대의 기능을 가진 explode함수도 있습니다.
array explode ( string $delimiter , string $string [, int $limit ] )


$doc = file("document.txt");
$doc_data = implode("", $doc);
echo $doc_data;


6. join 함수를 사용해서 읽는 방법
join 함수는 5.에서 사용한 implude 함수의 별칭입니다. 
$doc_data = join('', file("document.txt"));
echo $doc_data;




1 ~ 4 번의 방법은 fopen() 함수( 파일이나 URL을 여는 함수입니다. )를 통해서 파일을 열고,
fread(), fgetc(), fgets() 함수들을 통해서 파일을 읽는 방법으로 다른 언어와 마찬가지로.....
open이 있으면 close는 필수인 거 다 아시죠? 



출처: http://winplz.tistory.com/entry/PHP파일-읽기 [윈플]

simpleHtmlDom.zip



require_once _LIB_PATH."simpleHtmlDom/simple_html_dom.php";                      // html 파싱 유틸리티

$content = ""; // HTML
$dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
$html = $dom->load($content, $lowercase, $stripRN);



참고 : http://simplehtmldom.sourceforge.net/


// 7,8자리 숫자 추출 전부
preg_match_all("/[0-9]{7,8}/", $body_data_st, $matches);
print_r($matches);


// 특정문자열부터 시작해서 특정문자열까지 추출
preg_match("/추출시작문자열 :([^추출종료문자열]*)/is", $str, $matches);


// 괄호() 포함 삭제
$str = preg_replace("/\(([^\(\)]+)\)/", "", $str);


// 예: 블라블라 1회 또는 블라블라 1화 삭제
$str = preg_replace("/([0-9]{1,}(^[0-9])*회)|([0-9]{1,}(^[0-9])*화)|([0-9]{1,}(^[0-9])*편)|([0-9]{1,}(^[0-9])*부)/i", "", $str);


// 예 블라블라 제1회 삭제
$str = preg_replace("/_제[0-9]([^회]*회)/i", "", $str);


// 맨뒤에 숫자 삭제
$str = preg_replace("/[0-9]{1,}$/i", "", $str);


// 한글 포함여부
if ( preg_match("/[\xA1-\xFE][\xA1-\xFE]/", $str) ) {
//포함
}


'프로그래밍 > php' 카테고리의 다른 글

[php]파일을 문자열로 읽기.  (0) 2018.03.08
PHP Simple HTML DOM Parser  (0) 2018.02.27
컨텐츠 내용중 첫번째 IMG주소 뽑아내기  (0) 2018.02.27
GD  (0) 2018.02.27
captcha  (0) 2018.02.27

## 컨텐츠 내용중 첫번째 IMG주소 뽑아내기

	function boardContent_ImgUrl( $content ){
		$tmp_content = substr( $content, strpos($content, "') );
		return $img_url;
	}


'프로그래밍 > php' 카테고리의 다른 글

PHP Simple HTML DOM Parser  (0) 2018.02.27
정규식 예제  (0) 2018.02.27
GD  (0) 2018.02.27
captcha  (0) 2018.02.27
날짜 or 시간  (0) 2018.02.27

## 기본 GD처리

	$file_name_arr = explode(".", $_FILES['name']);
	$extention = strtolower($file_name_arr[count($file_name_arr)-1]);
	$file_name = time()."_".rand(9999,9999999).".".$extention;		// 파일명 임의생성
	
	$output_image = $files_data['tmp_name'];

	$upload_file_path = $_FILES['tmp_name'];
	$upload_file_type = mime_content_type($upload_file_path);
	
	//타입별로 로드시킴
	switch($upload_file_type) {	
		case "image/png":
			$im = imagecreatefrompng($upload_file_path);
			break;
		case "image/jpg":
		case "image/jpeg":
			$im = imagecreatefromjpeg($upload_file_path);
			break;
		case "image/gif":
			$im = imagecreatefromgif($upload_file_path);
			break;
	}
	
	if($im) {
	
		$output_image = _IMAGE_DIR.$folder_dir."/".$file_name;	// 이미지 저장 위치
		$imginfo = getimagesize($upload_file_path);
		
		imagecopyresampled($im, $im, 0, 0, 0, 0, 0, 0, $imginfo[0], $imginfo[1]);		//이미지생성부분
		//imagejpeg($im, $destpath, 100);

		switch($extention){
			 case 'gif': imagegif($im,$output_image);  break;
			 case 'png': imagepng($im,$output_image); break;
			 case 'jpg':
			 case 'jpeg': imagejpeg($im,$output_image, 100);break;	 //JPG 이미지로 표출됨
			 default : 
				$rs['result'] = false;
				$rs['msg'] = '이미지 처리 실패';
				return $rs;
		}
		ImageDestroy($im);                                //메모리 해제
	}


'프로그래밍 > php' 카테고리의 다른 글

PHP Simple HTML DOM Parser  (0) 2018.02.27
정규식 예제  (0) 2018.02.27
컨텐츠 내용중 첫번째 IMG주소 뽑아내기  (0) 2018.02.27
captcha  (0) 2018.02.27
날짜 or 시간  (0) 2018.02.27

+ Recent posts