MariaDB [mysql]> stop slave; 


한 뒤,


MariaDB [mysql]> SET GLOBAL sql_slave_skip_counter = 1;


하고



MariaDB [mysql]> start slave;



한다.




에러가 계속 발생하면,


위 단계를 반복한다.


블로그 이미지

엘로드넷

,

start slave 시 아래와 같은 메시지가 나온다.


MariaDB [mysql]> start slave;
ERROR 1201 (HY000): Could not initialize master info structure for ''; more error messages can be found in the MariaDB error log
MariaDB [mysql]> MariaDB [mysql]> start slave;
ERROR 1201 (HY000): Could not initialize master info structure for ''; more error messages can be found in the MariaDB error log
MariaDB [mysql]> 
MariaDB [mysql]> start slave;
ERROR 1201 (HY000): Could not initialize master info structure for ''; more error messages can be found in the MariaDB error log
MariaDB [mysql]> 
MariaDB [mysql]> start slave;
ERROR 1201 (HY000): Could not initialize master info structure for ''; more error messages can be found in the MariaDB error log
MariaDB [mysql]> 

MariaDB [mysql]> start slave;

ERROR 1201 (HY000): Could not initialize master info structure for ''; more error messages can be found in the MariaDB error log

MariaDB [mysql]> 




해결방법 : slave를 reset한 후 start 한다.




MariaDB [mysql]> reset slave;

Query OK, 0 rows affected (0.014 sec)


MariaDB [mysql]> start slave;

Query OK, 0 rows affected (0.015 sec)





블로그 이미지

엘로드넷

,

replication을 유지하면서 mysql-bin 로그 삭제



[마스터에서 수행]


1. 로그 목록 확인 [마스터에서 수행]


MariaDB [mysql]> show binary logs;

+------------------+------------+

| Log_name         | File_size  |

+------------------+------------+

| mysql-bin.000001 | 1073742334 |

| mysql-bin.000002 | 1073742066 |

| mysql-bin.000003 | 1073742021 |

| mysql-bin.000004 | 1073742090 |

| mysql-bin.000005 | 1074091311 |

| mysql-bin.000006 | 1074186164 |

| mysql-bin.000007 | 1074181534 |

| mysql-bin.000008 | 1073741968 |

| mysql-bin.000009 | 1073744583 |

| mysql-bin.000010 | 1073741939 |

| mysql-bin.000011 | 1000547863 |

+------------------+------------+

11 rows in set (0.00 sec)





1. 로그전체 삭제 --> replication 이 깨지므로 slave에서 replication을 다시 시작해줘야 한다.


MariaDB [mysql]>RESET MASTER;



2. replication유지하며 과거 로그 삭제


아래 명령어로 현재 slave가 사용중인 로그 확인[slave에서 수행]



MariaDB [mysql]> show slave status \G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.0.1

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000011

          Read_Master_Log_Pos: 1002605164

               Relay_Log_File: mysql-relay-bin.000034

                Relay_Log_Pos: 185226372

        Relay_Master_Log_File: mysql-bin.000011

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB: 

          Replicate_Ignore_DB: 

           Replicate_Do_Table: 

       Replicate_Ignore_Table: 

      Replicate_Wild_Do_Table: 

  Replicate_Wild_Ignore_Table: 

                   Last_Errno: 0

                   Last_Error: 

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 1002605164

              Relay_Log_Space: 1002606071

              Until_Condition: None

               Until_Log_File: 

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File: 

           Master_SSL_CA_Path: 

              Master_SSL_Cert: 

            Master_SSL_Cipher: 

               Master_SSL_Key: 

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error: 

               Last_SQL_Errno: 0

               Last_SQL_Error: 

  Replicate_Ignore_Server_Ids: 

             Master_Server_Id: 1

               Master_SSL_Crl: 

           Master_SSL_Crlpath: 

                   Using_Gtid: No

                  Gtid_IO_Pos: 

      Replicate_Do_Domain_Ids: 

  Replicate_Ignore_Domain_Ids: 

                Parallel_Mode: conservative

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

1 row in set (0.00 sec)


ERROR: No query specified


MariaDB [mysql]> 


현재 slave가 사용중인 master 의 로그 파일은 mysql-bin.000011 이다.


그러므로 이것 이전 로그파일은  삭제해도 replication이 깨지지 않는다.



로그를 삭제하기 위해 PURGE BINARY LOGS 명령어를 사용한다.[마스터에서 수행]



첫번째 방법 :  PURGE BINARY LOGS TO 'mysql-bin.00003';


mysql-bin.00003 보다 낮은 번호의 로그들이 한꺼번에 삭제된다.


(mysql-bin.000001, mysql-bin.000002이 삭제됨)




두번째 방법 : PURGE BINARY LOGS BEFORE '2019-01-15 00:00:00';

2019년 1월 15일 0시 이전에 생성된 로그 파일들이 모두 삭제된다.




끝.






블로그 이미지

엘로드넷

,

1. Tomcat server.xml 에 설정정보 추가



<GlobalNamingResources>


<!-- Oracle -->


<Resource name="jdbc/JNDI_ORACLE" auth="Container" 


                  connectionProperties="SetBigStringTryClob=true" 

                  driverClassName="oracle.jdbc.driver.OracleDriver"


                  maxActive="2" 

 maxIdle="2" 

 maxWait="-1" 

                  type="javax.sql.DataSource" 

                  url="jdbc:oracle:thin:@192.168.0.10:1521:ORCL"


                  username="TEST" password="TEST" />


<!-- MySQL -->


<Resource name="jdbc/JNDI_MYSQL" auth="Container" 


                  driverClassName="com.mysql.jdbc.Driver"


                  maxActive="8" maxIdle="8" maxWait="-1" 

                  type="javax.sql.DataSource" 

                  url="jdbc:mysql://192.168.0.11:3306/TESTDB"


                  username="TEST" password="TEST" />




<GlobalNamingResources>




2. Tomcat context.xml 에 설정정보 추가


<Context>


<!-- Oracle -->

<ResourceLink name="jdbc/JNDI_ORACLE"


                  global="jdbc/JNDI_ORACLE"

                  auth="Container"

                  type="javax.sql.DataSource" />


<!-- MySQL -->

<ResourceLink name="jdbc/JNDI_MYSQL"


                  global="jdbc/JNDI_MYSQL"

                  auth="Container"

                  type="javax.sql.DataSource" />



</Context>




3. context-datasource.xml 설정 변경


파일위치 : /프로젝트명/src/main/resources/egovframework/spring/com/context-datasource.xml



[변경전]



<!--

    <bean id="dataSource-oracle" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

        <property name="driverClassName" value="${Globals.DriverClassName}"/>

        <property name="url" value="${Globals.Url}" />

        <property name="username" value="${Globals.UserName}"/>

        <property name="password" value="${Globals.Password}"/>

        <property name="initialSize" value="0"/>

        <property name="maxActive" value="2"/>

        <property name="maxIdle" value="2"/>

        <property name="minIdle" value="0"/>

        <property name="maxWait" value="-1"/>

    </bean>



    <bean id="dataSource-mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

        <property name="driverClassName" value="${Globals.DriverClassName}"/>

        <property name="url" value="${Globals.Url}" />

        <property name="username" value="${Globals.UserName}"/>

        <property name="password" value="${Globals.Password}"/>

        <property name="initialSize" value="0"/>

        <property name="maxActive" value="2"/>

        <property name="maxIdle" value="2"/>

        <property name="minIdle" value="0"/>

        <property name="maxWait" value="-1"/>

    </bean>

-->



[변경후]


기존 bean 설정을 주석처리하고



<!-- Oracle -->

    <bean id="dataSource-oracle" class="org.springframework.jndi.JndiObjectFactoryBean">


        <property name="jndiName" value="java:comp/env/jdbc/JNDI_ORACLE"/>


    </bean>




<!-- MySQL -->

    <bean id="dataSource-mysql" class="org.springframework.jndi.JndiObjectFactoryBean">


        <property name="jndiName" value="java:comp/env/jdbc/JNDI_MYSQL"/>


    </bean>



끝.

블로그 이미지

엘로드넷

,

PHPMailer 사용 SMTP

PHP 2019. 1. 8. 23:37

필요한 파일

/lib/class.phpmailer.php

/lib/class.smtp.php

/lib/PHPMailerAutoload.php


 

 

 

require '/lib/PHPMailerAutoload.php';


 

    $mail = new PHPMailer;

    //$mail->SMTPSecure = 'tls';

    $mail->CharSet = "utf-8";

    $mail->Encoding = "base64";

    

    $mail->isSMTP();

    

    //Enable SMTP debugging

    // 0 = off (for production use)

    // 1 = client messages

    // 2 = client and server messages

    $mail->SMTPDebug = 0;

    $mail->Debugoutput = 'html';

    

    $mail->Host = '메일서버주소';

    $mail->Port = '포트';

    

    $mail->SMTPAuth = false;//true 또는 false

    

    $mail->Username = '유저명';

    $mail->Password = '비밀번호';

    

    $mail->setFrom('발신자이메일', '발신자명');//보내는이

    $mail->addAddress('수신자이메일1', '수신자명1');//받는이

    $mail->addAddress('수신자이메일2', '수신자명2');//받는이

    (계속 추가할 수 있음)

    

    $mail->addCC('cc메일주소', 'cc수신자명');

    $mail->addBCC('bcc메일주소', 'bcc수신자명');

    $mail->addReplyTo('답변받을이메일', '답변받는자');//답변받는자

    

    $subject = "메일제목입니다.";

    //$subject    = "=?utf-8?B?".base64_encode($subject)."?=\n";//UTF-8이 아닌 경우

    $mail->Subject = $subject;

    

    

      

    $body = "메일본문. html 가능";

    $body = file_get_contents('/where/message.html');//html파일을 가져올 경우

    $mail->msgHTML($body, dirname(__FILE__));

    

    $mail->AltBody = '이메일 본문입니다.';

    

    //폼으로 넘어온 첨부파일(userfile)이 있는 경우

    if (array_key_exists('userfile', $_FILES)) {

        $uploadfile = tempnam(sys_get_temp_dir(), sha1($_FILES['userfile']['name']));

        if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {  

                   $mail->addAttachment($uploadfile, 'My uploaded file');

                }

        }


       //첨부파일 경로를 알고 있는 경우
       $mail->addAttachment("/첨부파일경로/test.pdf", "test.pdf", "base64", "application/pdf");

    //send the message, check for errors

    if (!$mail->send()) {

  echo $mail->ErrorInfo;//에러메시지 출력

    } else { 

        echo "전송성공!";

    }

    


'PHP' 카테고리의 다른 글

magento23.0 OSX 모하비에 설치  (0) 2019.03.03
zendframework 3 설치  (0) 2019.02.28
코드이그나이터 3.1.9 + 오라클 데이터베이스 세션  (0) 2019.01.08
PHP7 session_regenerate_id() 대체  (0) 2019.01.08
IIS PHP 헤더설정  (0) 2019.01.08
블로그 이미지

엘로드넷

,

코드이그나이터 버전 : 3.1.9

오라클 : 12c

 

 

 

1. /application/config/config.php

 

 

$config['sess_driver'] = 'database';

$config['sess_save_path'] = 'CI_SESSIONS';

$config['sess_cookie_name'] = 'ci_session';

$config['sess_expiration'] = 3600;

$config['sess_expire_on_close'] = TRUE;

$config['sess_encrypt_cookie'] = TRUE;

$config['sess_use_database'] = TRUE;

$config['sess_table_name'] = 'CI_SESSIONS';

$config['sess_match_ip'] = TRUE;

$config['sess_match_useragent'] = TRUE;

$config['sess_time_to_update'] = 300;

 

$config['sess_regenerate_destroy'] = FALSE;



2. /application/config/database.php

$tnsname = '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.211.55.51)(PORT = 1521))

        (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))';

 

 

$db['default'] = array(

    'dsn' => '',

    'hostname' => $tnsname,

    'username' => 'ci3',

    'password' => 'ci3',

    'database' => '',

    'dbdriver' => 'oci8',    //mysqli, oci8

    'dbprefix' => '',

    'pconnect' => FALSE,

    'db_debug' => (ENVIRONMENT !== 'production'),

    'cache_on' => FALSE,

    'cachedir' => '',

    'char_set' => 'utf8',

    'dbcollat' => 'utf8_general_ci',

    'swap_pre' => '',

    'encrypt' => FALSE,

    'compress' => FALSE,

    'stricton' => FALSE,

    'failover' => array(),

    'save_queries' => TRUE

);



3. 테이블 만들기

CREATE TABLE CI_SESSIONS 

(

  SESSION_ID VARCHAR2(50 BYTE) DEFAULT '0' NOT NULL 

, TIMESTAMP NUMBER DEFAULT 0 NOT NULL 

, USER_AGENT VARCHAR2(256 BYTE) NOT NULL 

, USER_DATA VARCHAR2(1000 BYTE) 

, IP_ADDRESS VARCHAR2(256 BYTE) DEFAULT '0' NOT NULL 

) ;


CREATE UNIQUE INDEX CI_SESSIONS_PK ON CI_SESSIONS (SESSION_ID ASC

 

ALTER TABLE CI_SESSIONS ADD CONSTRAINT CI_SESSIONS_PK PRIMARY KEY (SESSION_ID);




4. /system/libraries/Session/drivers/Session_database_driver.php
변경(추가)된 부분은 빨간색으로 표시함.
-필드명과, 대소문자 주의

*오라클 사용자에게 SYS.DBMS_LOCK 권한이 주어져 있어야 함.
그렇지 않으면 다음과 같은 에러 메시지가 출력됨.

Message: oci_execute(): ORA-06550: 줄 3, 열4:PLS-00201: 'SYS.DBMS_LOCK' 식별자가 정의되어야 합니다 ORA-06550: 줄 3, 열4:PL/SQL: Statement ignored ORA-06550: 줄 4, 열15:PLS-00201: 'SYS.DBMS_LOCK' 식별자가 정의되어야 합니다 ORA-06550: 줄 4, 열4:PL/SQL: Statement ignored

 

 

 

CI3사용자에게 SYS.DBMS_LOCK 권한을 주는 방법 : 

SQLPLUS로  SYS로 로그인.

 

SQL> GRANT EXECUTE ON SYS.DBMS_LOCK TO CI3;

권한이 부여되었습니다.

 

 

 

 






<?php

/**

 * CodeIgniter

 *

 * An open source application development framework for PHP

 *

 * This content is released under the MIT License (MIT)

 *

 * Copyright (c) 2014 - 2018, British Columbia Institute of Technology

 *

 * Permission is hereby granted, free of charge, to any person obtaining a copy

 * of this software and associated documentation files (the "Software"), to deal

 * in the Software without restriction, including without limitation the rights

 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

 * copies of the Software, and to permit persons to whom the Software is

 * furnished to do so, subject to the following conditions:

 *

 * The above copyright notice and this permission notice shall be included in

 * all copies or substantial portions of the Software.

 *

 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

 * THE SOFTWARE.

 *

 * @package CodeIgniter

 * @author EllisLab Dev Team

 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)

 * @copyright Copyright (c) 2014 - 2018, British Columbia Institute of Technology (http://bcit.ca/)

 * @license http://opensource.org/licenses/MIT MIT License

 * @link https://codeigniter.com

 * @since Version 3.0.0

 * @filesource

 */

defined('BASEPATH') OR exit('No direct script access allowed');

 

/**

 * CodeIgniter Session Database Driver

 *

 * @package CodeIgniter

 * @subpackage Libraries

 * @category Sessions

 * @author Andrey Andreev

 * @link https://codeigniter.com/user_guide/libraries/sessions.html

 */

class CI_Session_database_driver extends CI_Session_driver implements SessionHandlerInterface {

 

/**

 * DB object

 *

 * @var object

 */

protected $_db;

 

/**

 * Row exists flag

 *

 * @var bool

 */

protected $_row_exists = FALSE;

 

/**

 * Lock "driver" flag

 *

 * @var string

 */

protected $_platform;

 

// ------------------------------------------------------------------------

 

/**

 * Class constructor

 *

 * @param array $params Configuration parameters

 * @return void

 */

public function __construct(&$params)

{

parent::__construct($params);

 

$CI =& get_instance();

isset($CI->db) OR $CI->load->database();

$this->_db = $CI->db;

 

if ( ! $this->_db instanceof CI_DB_query_builder)

{

throw new Exception('Query Builder not enabled for the configured database. Aborting.');

}

elseif ($this->_db->pconnect)

{

throw new Exception('Configured database connection is persistent. Aborting.');

}

elseif ($this->_db->cache_on)

{

throw new Exception('Configured database connection has cache enabled. Aborting.');

}

 

$db_driver = $this->_db->dbdriver.(empty($this->_db->subdriver) ? '' : '_'.$this->_db->subdriver);

if (strpos($db_driver, 'mysql') !== FALSE)

{

$this->_platform = 'mysql';

}

elseif (in_array($db_driver, array('postgre', 'pdo_pgsql'), TRUE))

{

$this->_platform = 'postgre';

}

/* ellord */

elseif (strpos($db_driver,'oci8') !== FALSE)

{

    $this->_platform = 'oracle';

}

// Note: BC work-around for the old 'sess_table_name' setting, should be removed in the future.

if ( ! isset($this->_config['save_path']) && ($this->_config['save_path'] = config_item('sess_table_name')))

{

log_message('debug', 'Session: "sess_save_path" is empty; using BC fallback to "sess_table_name".');

}

}

 

// ------------------------------------------------------------------------

 

/**

 * Open

 *

 * Initializes the database connection

 *

 * @param string $save_path Table name

 * @param string $name Session cookie name, unused

 * @return bool

 */

public function open($save_path, $name)

{

if (empty($this->_db->conn_id) && ! $this->_db->db_connect())

{

return $this->_fail();

}

 

$this->php5_validate_id();

 

return $this->_success;

}

 

// ------------------------------------------------------------------------

 

/**

 * Read

 *

 * Reads session data and acquires a lock

 *

 * @param string $session_id Session ID

 * @return string Serialized session data

 */

public function read($session_id)

{

if ($this->_get_lock($session_id) !== FALSE)

{

// Prevent previous QB calls from messing with our queries

$this->_db->reset_query();

 

// Needed by write() to detect session_regenerate_id() calls

$this->_session_id = $session_id;

 

$this->_db

->select('USER_DATA')

->from($this->_config['save_path'])

->where('SESSION_ID', $session_id);

 

if ($this->_config['match_ip'])

{

$this->_db->where('IP_ADDRESS', $_SERVER['REMOTE_ADDR']);

}

 

if ( ! ($result = $this->_db->get()) OR ($result = $result->row()) === NULL)

{

// PHP7 will reuse the same SessionHandler object after

// ID regeneration, so we need to explicitly set this to

// FALSE instead of relying on the default ...

$this->_row_exists = FALSE;

$this->_fingerprint = md5('');

return '';

}

 

// PostgreSQL's variant of a BLOB datatype is Bytea, which is a

// PITA to work with, so we use base64-encoded data in a TEXT

// field instead.

if ($this->_platform === 'postgre')

{

    $result=base64_decode(rtrim($result->data));

}

/* ellord */

elseif ($this->_platform === 'oracle')

{

 

    //$result=base64_decode(rtrim($result->data->load()));

    $result=base64_decode(rtrim($result->USER_DATA));

}

else {

    $result=$result->data;

}

 

 

$this->_fingerprint = md5($result);

$this->_row_exists = TRUE;

return $result;

}

 

$this->_fingerprint = md5('');

return '';

}

 

// ------------------------------------------------------------------------

 

/**

 * Write

 *

 * Writes (create / update) session data

 *

 * @param string $session_id Session ID

 * @param string $session_data Serialized session data

 * @return bool

 */

public function write($session_id, $session_data)

{

// Prevent previous QB calls from messing with our queries

$this->_db->reset_query();

 

// Was the ID regenerated?

if (isset($this->_session_id) && $session_id !== $this->_session_id)

{

if ( ! $this->_release_lock() OR ! $this->_get_lock($session_id))

{

return $this->_fail();

}

 

$this->_row_exists = FALSE;

$this->_session_id = $session_id;

}

elseif ($this->_lock === FALSE)

{

return $this->_fail();

}

 

if ($this->_row_exists === FALSE)

{

    

    

    if ($this->_platform === 'oracle')

    {

        

        $dateTime = time() + 3600;

        $sql = '

                        MERGE INTO "'.$this->_config['save_path'].'" A

                            USING DUAL

                            ON (A.SESSION_ID = :session_id)

                            WHEN MATCHED THEN

                                      UPDATE SET

                            

                                            TIMESTAMP = :timestamp,

                                            USER_AGENT = :user_agent,

                                            USER_DATA = :user_data,

                                            IP_ADDRESS = :ip_address

                            

                            

                            WHEN NOT MATCHED THEN

                                      INSERT (SESSION_ID, TIMESTAMP, USER_AGENT, USER_DATA, IP_ADDRESS)

                                             VALUES (:session_id, :timestamp, :user_agent, :user_data, :ip_address)

                            

                ';

        $enc_session_data = base64_encode($session_data);

        

        $stmt = oci_parse($this->_db->conn_id, $sql);

        oci_bind_by_name($stmt, ':session_id', $session_id, -1, SQLT_CHR);

        oci_bind_by_name($stmt, ':ip_address', $_SERVER['REMOTE_ADDR'], -1, SQLT_CHR);

        $time=time();

        oci_bind_by_name($stmt, ':timestamp', $time, -1, SQLT_INT);

        oci_bind_by_name($stmt, ':user_data', $enc_session_data, -1, SQLT_CHR);

        oci_bind_by_name($stmt, ':user_agent', $_SERVER['HTTP_USER_AGENT'], -1, SQLT_CHR);

        

        

        $bOk = oci_execute($stmt, OCI_DEFAULT);

        if ($bOk)

        {

            oci_commit($this->_db->conn_id);

            oci_free_statement($stmt);

            $this->_fingerprint = md5($session_data);

            $this->_row_exists = TRUE;

            return $this->_success;

        }

        else

        {

            oci_rollback($this->_db->conn_id);

            oci_free_statement($stmt);

            return $this->_fail();

        }

        

        

        

    }else{

     $insert_data = array(

     'session_id' => $session_id,

     'ip_address' => $_SERVER['REMOTE_ADDR'],

     'timestamp' => time(),

     'user_data' => ($this->_platform === 'postgre' ? base64_encode($session_data) : $session_data)

     );

    }

    

    

if ($this->_db->insert($this->_config['save_path'], $insert_data))

{

$this->_fingerprint = md5($session_data);

$this->_row_exists = TRUE;

return $this->_success;

}

 

return $this->_fail();

}

 

$this->_db->where('SESSION_ID', $session_id);

if ($this->_config['match_ip'])

{

$this->_db->where('IP_ADDRESS', $_SERVER['REMOTE_ADDR']);

}

 

$update_data = array('TIMESTAMP' => time());

if ($this->_fingerprint !== md5($session_data))

{

         $update_data['USER_DATA'] = ($this->_platform === 'postgre' || $this->_platform === 'oracle')

? base64_encode($session_data

: $session_data;

}

 

if ($this->_db->update($this->_config['save_path'], $update_data))

{

$this->_fingerprint = md5($session_data);

return $this->_success;

}

 

return $this->_fail();

}

 

// ------------------------------------------------------------------------

 

/**

 * Close

 *

 * Releases locks

 *

 * @return bool

 */

public function close()

{

return ($this->_lock && ! $this->_release_lock())

? $this->_fail()

: $this->_success;

}

 

// ------------------------------------------------------------------------

 

/**

 * Destroy

 *

 * Destroys the current session.

 *

 * @param string $session_id Session ID

 * @return bool

 */

public function destroy($session_id)

{

if ($this->_lock)

{

// Prevent previous QB calls from messing with our queries

$this->_db->reset_query();

 

$this->_db->where('SESSION_ID', $session_id);

if ($this->_config['match_ip'])

{

$this->_db->where('IP_ADDRESS', $_SERVER['REMOTE_ADDR']);

}

 

if ( ! $this->_db->delete($this->_config['save_path']))

{

return $this->_fail();

}

}

 

if ($this->close() === $this->_success)

{

$this->_cookie_destroy();

return $this->_success;

}

 

return $this->_fail();

}

 

// ------------------------------------------------------------------------

 

/**

 * Garbage Collector

 *

 * Deletes expired sessions

 *

 * @param int  $maxlifetime Maximum lifetime of sessions

 * @return bool

 */

public function gc($maxlifetime)

{

// Prevent previous QB calls from messing with our queries

$this->_db->reset_query();

 

return ($this->_db->delete($this->_config['save_path'], 'TIMESTAMP < '.(time() - $maxlifetime)))

? $this->_success

: $this->_fail();

}

 

// --------------------------------------------------------------------

 

/**

 * Validate ID

 *

 * Checks whether a session ID record exists server-side,

 * to enforce session.use_strict_mode.

 *

 * @param string $id

 * @return bool

 */

public function validateId($id)

{

// Prevent previous QB calls from messing with our queries

$this->_db->reset_query();

 

$this->_db->select('1')->from($this->_config['save_path'])->where('SESSION_ID', $id);

empty($this->_config['match_ip']) OR $this->_db->where('IP_ADDRESS', $_SERVER['REMOTE_ADDR']);

$result = $this->_db->get();

empty($result) OR $result = $result->row();

 

return ! empty($result);

}

 

// ------------------------------------------------------------------------

 

/**

 * Get lock

 *

 * Acquires a lock, depending on the underlying platform.

 *

 * @param string $session_id Session ID

 * @return bool

 */

protected function _get_lock($session_id)

{

if ($this->_platform === 'mysql')

{

$arg = md5($session_id.($this->_config['match_ip'] ? '_'.$_SERVER['REMOTE_ADDR'] : ''));

if ($this->_db->query("SELECT GET_LOCK('".$arg."', 300) AS ci_session_lock")->row()->ci_session_lock)

{

$this->_lock = $arg;

return TRUE;

}

 

return FALSE;

}

elseif ($this->_platform === 'postgre')

{

$arg = "hashtext('".$session_id."')".($this->_config['match_ip'] ? ", hashtext('".$_SERVER['REMOTE_ADDR']."')" : '');

if ($this->_db->simple_query('SELECT pg_advisory_lock('.$arg.')'))

{

$this->_lock = $arg;

return TRUE;

}

 

return FALSE;

}

/* ellord */

elseif ($this->_platform === 'oracle')

{

    $lockname=$session_id.($this->_config['match_ip'] ? '_'.$_SERVER['REMOTE_ADDR'] : '');

    $lockid='';

    $result=99;

    $sql='

begin

SYS.DBMS_LOCK.ALLOCATE_UNIQUE (:lockname, :lockid);

:result := SYS.DBMS_LOCK.REQUEST (:lockid, DBMS_LOCK.X_MODE, 300, FALSE);

end;';

    $stmt = oci_parse($this->_db->conn_id,$sql);

    oci_bind_by_name($stmt,':lockname',$lockname,-1,SQLT_CHR);

    oci_bind_by_name($stmt,':lockid',$lockid,256,SQLT_CHR);

    oci_bind_by_name($stmt,':result',$result,2,SQLT_INT);

    

    $bOk=oci_execute($stmt);

    /*echo 'getlock ';

     var_dump(array($result,$lockid)); */

    if ($bOk && $result==0)

    {

        $this->_lock = $lockid;

        return TRUE;

    }

    return FALSE;

    

}

return parent::_get_lock($session_id);

}

 

// ------------------------------------------------------------------------

 

/**

 * Release lock

 *

 * Releases a previously acquired lock

 *

 * @return bool

 */

protected function _release_lock()

{

if ( ! $this->_lock)

{

return TRUE;

}

 

if ($this->_platform === 'mysql')

{

if ($this->_db->query("SELECT RELEASE_LOCK('".$this->_lock."') AS ci_session_lock")->row()->ci_session_lock)

{

$this->_lock = FALSE;

return TRUE;

}

 

return FALSE;

}

elseif ($this->_platform === 'postgre')

{

if ($this->_db->simple_query('SELECT pg_advisory_unlock('.$this->_lock.')'))

{

$this->_lock = FALSE;

return TRUE;

}

 

return FALSE;

}

/* ellord */

elseif ($this->_platform === 'oracle')

{

    

    $sql='

begin

:result := SYS.DBMS_LOCK.RELEASE (:lockid);

end;';

    $stmt = oci_parse($this->_db->conn_id,$sql);

    $result=99;

    oci_bind_by_name($stmt,':lockid',$this->_lock,256,SQLT_CHR);

    oci_bind_by_name($stmt,':result',$result,2,SQLT_INT);

    

    

    $bOk=oci_execute($stmt);

    

    /*echo 'releaselock ';

     var_dump(array($result,$this->_lock));*/

    

    if ($bOk && $result==0)

    {

        $this->_lock = FALSE;

        return TRUE;

    }

    return FALSE;

}

return parent::_release_lock();

}

}







7e2431ed98c6d12fad6c84c8d60026f7_1534677020_9655.png




5. 참고

* 세션 데이터가 중복하여 생성되거나 새로고침 할 때마다 생기는 경우

3.0.x  버전에서 생기는 버그이므로 3.1.9 최신버전으로 업데이트 하면 된다.


'PHP' 카테고리의 다른 글

zendframework 3 설치  (0) 2019.02.28
PHPMailer 사용 SMTP  (0) 2019.01.08
PHP7 session_regenerate_id() 대체  (0) 2019.01.08
IIS PHP 헤더설정  (0) 2019.01.08
단방향 암호화 문자열 crypt sha512 암호화  (0) 2019.01.08
블로그 이미지

엘로드넷

,

function my_session_start() {

    @session_start();

    if (isset($_SESSION['destroyed'])) {

        if ($_SESSION['destroyed'] < time()-300) {

            // 일반적으로 일어나서는 안됨. 느리거나 불안정한 네트웍일때

            // 이 사용자 세션의 모든 인증상태를 제거

            @remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);

            //throw(new DestroyedSessionAccessException);

        }

        if (isset($_SESSION['new_session_id'])) {

            // 아직 만료되지 않음. 불안정한 네트워크로 인해 쿠키가 손실될 수 있음

            // 다시 올바른 세션ID 쿠키 생성

            // 주의: 인증 플래그를 제거하려면 세션 ID를 다시 설정하지 마십시오.

            session_commit();

            session_id($_SESSION['new_session_id']);

            // 새로운 세션ID가 있어야 함.

            @session_start();

            return;

        }

    }

    

    //session_write_close();

}

 

 

 

my_session_start();

 

 

 

 

 

 

function my_session_regenerate_id() {

            // 불안정한 네트워크로 인해 세션ID가 설정되지 않은 경우 올바른 세션ID를 설정하려면 새 세션ID가 필요함.

            

            $new_session_id = session_create_id();

            //$new_session_id = session_regenerate_id();//for php7.0

            $_SESSION['new_session_id'] = $new_session_id;

            

            // Set destroy timestamp

            $_SESSION['destroyed'] = time();

            

            // 현재 세션 쓰기 및 닫기;

// DB에 세션을 저장하는 경우 주석처리

            session_save_path($_SERVER['DOCUMENT_ROOT'] . "/data/session");

            

            session_commit();

            

            // Start session with new session ID

            session_id($new_session_id);

            ini_set('session.use_strict_mode', 0);

            @session_start();

            ini_set('session.use_strict_mode', 1);

            

            // New session does not need them

            unset($_SESSION['destroyed']);

            unset($_SESSION['new_session_id']);

}

        

 

my_session_regenerate_id();

 

 

 

 

참조 : http://php.net/manual/en/function.session-regenerate-id.php

 

블로그 이미지

엘로드넷

,

IIS PHP 헤더설정

PHP 2019. 1. 8. 23:35

HTTP 응답헤더 설정

 

1452e2743cb3fda4b0515cd404d3994c_1534377785_9074.png
 

아래 내용 추가

 

X-Content-Type-Options nosniff

X-Frame-Options SAMEORIGIN

 

X-XSS-Protection 1; mode=block

 

 

 

1452e2743cb3fda4b0515cd404d3994c_1534377848_5007.png
 

 

 

 

블로그 이미지

엘로드넷

,

$newpasshash = crypt("비밀번호", '$6$rounds=10000$salts$');

 

$6 : SHA512 //SHA256은 $5

rounds=10000 : 해싱루프 숫자 : 1000 ~ 999999999 까지

salts : 임의의 문자열

 

결과 :  $6$rounds=10000$salts$oS9pt.WPNWUrsuH64IR8jC0i0vbHTRHJRC5tCD.fw.lgHtFxB6Y6FuqhNt6WQschEyBLK1sTN8qUURZDV672e.

 

 

 

비교 : 

if(validate_pw("비밀번호", "$6$rounds=10000$salts$oS9pt.WPNWUrsuH64IR8jC0i0vbHTRHJRC5tCD.fw.lgHtFxB6Y6FuqhNt6WQschEyBLK1sTN8qUURZDV672e.")){ 

echo "암호일치";

}else{

echo "불일치";

}

 

 

 

function validate_pw($password, $hash){

    /* Regenerating the with an available hash as the options parameter should

     * produce the same hash if the same password is passed.

     */

    return crypt($password, $hash)==$hash;

 

}

 

'PHP' 카테고리의 다른 글

PHP7 session_regenerate_id() 대체  (0) 2019.01.08
IIS PHP 헤더설정  (0) 2019.01.08
CentOS7 에서 php7.2 yum 설치  (0) 2018.06.07
CentOS7 PHP7 oci8.so 설치  (0) 2017.11.07
php-mcrypt 설치가 안될 때  (0) 2017.11.05
블로그 이미지

엘로드넷

,

1. 복구모드로 부팅 ( 커맨드 + R)

2. 터미널 열기

3. cd /Volumes

4. mkdir TimeMachine

5. cd TimeMachine

6. mount -t afp afp://아디디:비밀번호@외부타임머신서버/타임머신폴더 /Volumes/TimeMachine

7. ls -la (.sparsebundle 확장자를 가진 파일을 확인한다.)

8. hdid /Volumes/TimeMachine/이름.sparsebundle

9. exit

 

 

enter image description here 

 

 

10. Restore From Time Machine Backup

enter image description here 

 

11. 타임머신 폴더를 선택한다.("Backup" on network "sunvm100105")

enter image description here 

 

12. 원하는 백업본을 선택한다.

enter image description here 

 

13. 복구할 디스크를 선택한다.

enter image description here 

 

14. 기다리면 된다.

 

블로그 이미지

엘로드넷

,