PHP 2의 세션에 대한 자세한 설명
개요
세션이란 사용자가 웹사이트를 탐색할 때 웹사이트에 진입한 후 브라우저를 닫을 때까지의 시간, 즉 사용자가 웹사이트를 탐색할 때까지의 시간을 말합니다. 웹사이트 시간을 탐색합니다. 위의 정의에서 Session은 실제로 특정 시간 개념임을 알 수 있습니다.
일반적으로 웹사이트의 특정 페이지에 있는 변수(서버측 변수 참조, 이하 동일)는 다음 페이지에서 사용할 수 없습니다. 세션에 등록된 변수를 전역 변수로 사용할 수 있습니다. 이러한 방식으로 세션을 사용하여 사용자 신원 인증, 프로그램 상태 기록, 페이지 간 매개변수 전송 등을 수행할 수 있습니다.
PHP3 버전에서는 세션이 어떻게 구현되나요?
PHP3 자체는 세션 기능을 구현하지 않습니다. 이를 달성하기 위해 가장 유명한 방법은 phplib입니다. phplib의 가장 기본적인 기능에는 사용자 인증, 세션 관리, 권한 및 데이터베이스 추상화가 포함됩니다. 다음으로 phplib을 사용하여 세션을 구현하는 방법을 설명하겠습니다.
1. 먼저 phplib를 설치합니다(win32의 경우 환경은 win2000+php3.0.16+Apache1.3.12+phplib7.2c+mysql3.23.21입니다)
먼저 phplib의 압축을 풀면 "php가 있습니다. " 디렉터리에 있는 경우 이 디렉터리를 Apache 설치 디렉터리에 복사합니다. 예: Apache가 d:Apache 디렉터리에 설치된 다음 "php" 디렉터리를 d:Apache에 복사하고, phplib 디렉터리의 페이지 디렉터리에 있는 파일 및 디렉터리(디렉토리 자체 제외)를 d:Apachehtdocs에 복사합니다.
시스템에 따라 phplib 클래스 라이브러리를 초기화해야 하며, 일부 기본 매개변수가 포함된 local.inc 파일을 수정해야 할 수 있으며, 이는 시스템의 실제 상황에 따라 수정될 수 있습니다.
d:Apachephpprepend.php 파일의 프로그램을 다음과 같이 변경합니다.
if (!isset($_PHPLIB) or !is_array($_PHPLIB)) { $_PHPLIB["libdir"] = "d:/Apache/php/"; //放phplib下php目录的路径 } 修改d:\Apache\php\local.inc文件: class DB_Example extends DB_Sql { var $Host = "localhost"; //mysql数据库所在主机名 var $Database = "test"; //数据库名 var $User = "root"; //数据库用户名 var $Password = "1234567"; //数据库用户密码 }
마지막으로 phplib 아래의 stuff 하위 디렉터리에 있는 create_database.mysql 파일을 기반으로 초기 테이블을 생성합니다. 예배 규칙서.
phplib를 사용하는 모든 페이지는 먼저 phplib를 실행하는 데 필요한 클래스 라이브러리 파일을 찾아야 하므로 php.ini에서 auto_prepend 변수를 설정하여 이를 지원하도록 할 수 있습니다. phplib에는 prepend.php 파일이 포함되어 있으며 Auto_prepend를 After "d:/ Apache/php/prepend.php"(따옴표 포함)를 입력하면 각 페이지에 자동으로 phplib 클래스 라이브러리가 포함됩니다. 또한 phplib 클래스 라이브러리가 있는 디렉터리를 include 변수에 추가하여 이러한 파일을 찾을 수 있습니다.
2. page_open() 함수 호출
phplib을 사용하는 모든 페이지에서는 먼저 초기화를 위해 page_open 함수를 호출해야 합니다. 예:
<?php page_open(array("sess" => "Test_Session")); ?>
배열 변수 (sess)는 일부 상태 저장 객체를 초기화하는 데 사용됩니다. 여기서 주의해야 할 점은 phplib 내장 이름(sess)을 사용해야 한다는 것입니다.
phplib는 쿠키를 사용하여 상태 정보를 저장하므로 페이지 내용이 브라우저에 출력되기 전에 page_open() 함수를 호출해야 합니다. PHP 스크립트는 관련 상태 데이터를 데이터베이스에 다시 쓰는 page_close()로 끝나야 합니다. 그렇지 않으면 변수가 손실됩니다.
3. 구체적인 용도.
변수를 등록한 후 세션이 종료될 때까지 다음 페이지에서 사용할 수 있습니다. 방법:
register( "varname"); ?>
여기서 varname은 변수 값이 아니라 변수 이름을 먼저 지정한 후 할당할 수 있습니다. 값. 특정 페이지에서 변수의 값을 변경할 수 있으며, 다음 페이지에서 해당 변수에 접근하면 변경된 값을 얻게 됩니다. 변수의 유형은 다양하며 문자열, 숫자 또는 배열이 될 수 있습니다. 예:
첫 번째 페이지:
page_open(array("sess" => "Test _Session"))
$sess->register( "welcome"); $welcome 변수를 등록하세요. $
$welcome="Hello, PHP world!"
…
page_close()
page_open();//세션 시작
echo $welcome;//첫 번째 페이지에 정의된 $welcome 표시
page_close();//상태 정보 저장
?>
변수 등록 후 , 페이지가 마지막으로 page_close() 함수를 호출하면 각 세션 변수가 데이터베이스에 다시 기록됩니다. page_close() 함수 호출을 잊어버리면 변수가 데이터베이스에 다시 기록되지 않으므로 예측할 수 없는 결과가 발생합니다. 변수가 사용되고 더 이상 필요하지 않은 경우 다음 함수를 호출하여 변수를 삭제할 수 있습니다.
<?php page_open(array("sess" => "Test _Session")); …… $sess->unregister( "variable_name"); …… page_close(); ?>
在PHP4版本中是如何实现session的?
php4的session也靠cookies保存session id,用文件系统保存变量(默认情况下),因此,它的session变量不能保存对象。当然也可以将session保存在数据库中。
在php4中有关session的函数很多(详见php.ini配置一文),通常情况下我们只需要调用三个函数即可:sesssion_start()、session_register()、session_is_registered()。
在需要用到session的每一页的最开始处调用session_start()函数, 例如:
<?session_start()?>
<html><body>
<?
$welcome="hello world !";
session_register("welcome");//注册$welcome变量,注意没有$符号
if(session_is_registered("welcome"))//检查$welcome变量是否注册
echo "welcome变量已经注册了!";
else
echo "welcome变量还没有注册!";
?>
</body></html>
php4中session处理的定制
我们需要扩充6个函数:
sess_open($sess_path, $session_name);
这个函数被session处理程序调用来作初始化工作。
参数$sess_path对应php.ini文件中的session.save_path选项
参数$session_name对应php.ini中的session.name 选项。
sess_close();
这个函数在页面结束执行并且session处理程序需要关闭时被调用
sess_read($key);
这个函数在session处理程序读取指定session键值($key)时,检索并返回标识为$key的session数据.(注意:序列化是将变量或对象在程序结束或需要时保存在文件中,在下次程序运行或需要时再调入内存的技术,有别于只保存数据的方法。)
sess_write($key, $val);
这个函数据在session处理程序需要将数据保存时调用,这种情况经常在程序结束时发生。它负责将数据保存在下次能用sess_read($key)函数检索的地方。
sess_destroy($key);
这个函数在需要消毁session时。它负责删除session并且清除环境。
sess_gc($maxlifetime);
这个函数负责清理碎片。在这种情况下,它负责删除过时的session数据。session处理程序会偶尔调用它们。
定制程序可以用mysql数据库或DBM文件保存session数据,视具体的情况而定。如果使用mysql作支持,那还需要进行以下的步骤:
首先在mysql中创建一个sessions数据库,并且创建一个sessions表:
mysql> CREATE DATABASE sessions;
mysql> GRANT select, insert, update, delete ON sessions.* TO phpsession@localhost
-> IDENTIFIED BY 'phpsession';
mysql> CREATE TABLE sessions (
-> sesskey char(32) not null,
-> expiry int(11) unsigned not null,
-> value text not null,
-> PRIMARY KEY (sesskey)
-> );
下一步,修改session_mysql.php文件的$SESS_DB* 变量使其匹配你机器上的数据库设置:
<?
$SESS_DBHOST = "localhost"; /* 数据库主机名 */
$SESS_DBNAME = "sessions"; /* 数据库名 */
$SESS_DBUSER = "phpsession"; /* 数据库用户名 */
$SESS_DBPASS = "phpsession"; /* 数据库密码 */
$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……//定制函数
session_set_save_handler( "sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
定制使用dbm文件时的接口 :
<?
$SESS_DBM = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
……//定制函数
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
?>
session定制的测试代码:
<?php
……
if ($handler == "dbm") include("session_dbm.php");//使用何种接口
elseif ($handler == "mysql") include("session_mysql.php");
else ……
session_start();
session_register("count");
......
?>
인증에 Session을 어떻게 사용하나요?
세션을 사용하여 사용자를 인증할 수 있습니다.
사용자가 합법적인지 확인합니다.
Session_start()
……//확인 프로세스
session_register("reguser");
사용자가 다른 페이지에 로그인되어 있는지 확인하세요
session_start(); 이미 로그인되어 있습니다
echo "환영합니다"
}else{//로그인하지 않은 경우 > echo "먼저 등록해주세요!";
}
?>
사용자 로그아웃:
session_destroy();
질문: 내 유닛에 대한 구매, 판매 및 재고 시스템을 작성할 때 여러 사용자가 동시에 PHP 애플리케이션에 들어갈 수 있도록 허용해야 한다는 것을 알았습니다. 원래 설계된 정적 고유 세션 ID로 인해 데이터 혼란이 발생했습니다. 이러한 방식으로 고유한 세션 ID를 동적으로 생성하는 것이 최우선 과제가 됩니다.
해결책은 간단합니다. PHP 파일 이름 + 타임스탬프를 고유 세션 ID로 사용하여 프로그램의 각 세션이 제자리에 있고 더 이상 혼란이 없도록 했습니다.
같은 문제를 겪고 있는 친구들이 해결책을 찾을 수 있도록 아래 소스 코드를 공개하겠습니다.
//변수를 보존하기 위해 PHP 세션을 시작합니다.
if (empty($mysessionname) ) {
$micro = microtime()
$micro = str_replace(" ","",$ micro); // 공백을 제거합니다
$micro = str_replace(".","",$micro) // 마침표를 제거합니다
$mysessionname = "po_maint" $micro; }
Session_name($mysessionname);
session_start();
프로그램 참고 사항:
페이지 간에 고유한 세션 이름에 대한 변수를 전달하려면 위의 이름을 만들어야 합니다. 프로그램 작은 변화. Mysessionname은 세션이 시작되기 전에 이미 존재하므로 세션의 내부 변수 이름이 될 수 없습니다. 여러 세션이 원래 쿠키 파일을 덮어쓰게 되므로 Mysessionname은 쿠키 모드로 저장할 수 없습니다. 숨겨진 양식 필드를 사용하여 저장할 수 있습니다. 그러면 문제가 없을 것입니다.
PHP에서 세션을 사용하는 자세한 방법은 PHP 중국어 홈페이지 2/2페이지 관련 글을 참고해주세요!