當前位置:首頁 » 編程語言 » ip2longphp

ip2longphp

發布時間: 2023-02-26 14:25:15

❶ 如何在php上限制一個ip一天只能注冊10個賬戶,注冊多了不允許

思路:

獲取訪問用戶ip,查詢資料庫判斷該ip是否可以繼續注冊新用戶

示例

/**
*CreatedbyPhpStorm.
*User:Administrator
*Date:2018/11/30
*Time:19:35
*限制一個ip一天只能注冊10個賬戶
*獲取訪問用戶ip,查詢資料庫判斷該ip是否可以繼續注冊新用戶
*/
//獲取資料庫實例
$dsn='mysql:dbname=test;host=127.0.0.1';
$user='root';
$password='';
try{
$db=newPDO($dsn,$user,$password,array(PDO::MYSQL_ATTR_INIT_COMMAND=>"setnamesutf8"));
}catch(PDOException$e){
echo'Connectionfailed:'.$e->getMessage();
}

//獲取訪問用戶ip
$access_user_ip=$_SERVER['REMOTE_ADDR'];

//查詢資料庫判斷該ip是否可以繼續注冊新用戶
$start_time=strtotime(date('Y-m-d'));//今天0點
$end_time=strtotime(date('Y-m-d').'+1day');//明天0點
$sth=$db->prepare('selectcount(*)fromuserwhereip=:ipandcreated_at>:start_timeandcreated_at<:end_time');
$sth->bindParam(':ip',$access_user_ip);
$sth->bindParam(':start_time',$start_time);
$sth->bindParam(':end_time',$end_time);
$sth->execute();
$count=$sth->fetchColumn();//當前該ip今天注冊的用戶總數量
if($count>10){
exit('今天,您已注冊10個新賬號了,請明天再來吧');
}

源碼放在github上,歡迎點星網頁鏈接

❷ PHP軟體開發中如何提高項目的運行效率

PHP軟體開發中如何提高項目的運行效率

如何提高PHP程序執行效率?編程習慣分析,PHP程序原本是解釋性程序語言,其執行速度本來就不高,如果在日常開發中不注意編程習慣就很難提高其執行效率,下文從PHP編程和mysql數據效率兩個方面分析哪些提高其執行效率的要點PHP軟體開發中如何提高項目的運行效率
一、PHP提高效率的要點
1、如果能將類的方法定義成static,就盡量定義成static,它的速度會提升將近4倍。

2、$row[』id』] 的速度是$row[id]的7倍。

3、echo 比 print 快,並且使用echo的多重參數(譯註:指用逗號而不是句點)代替字元串連接,比如echo $str1,$str2。

4、在執行for循環之前確定最大循環數,不要每循環一次都計算最大值,最好運用foreach代替。

5、注銷那些不用的變數尤其是大數組,以便釋放內存。

6、盡量避免使用__get,__set,__autoload。

7、require_once()代價昂貴。

8、include文件時盡量使用絕對路徑,因為它避免了PHP去include_path里查找文件的速度,解析操作系統路徑所需的時間會更少。

9、如果你想知道腳本開始執行(譯註:即伺服器端收到客戶端請求)的時刻,使用$_SERVER[『REQUEST_TIME』]要好於time()。

10、函數代替正則表達式完成相同功能。

11、str_replace函數比preg_replace函數快,但strtr函數的效率是str_replace函數的四倍。

12、如果一個字元串替換函數,可接受數組或字元作為參數,並且參數長度不太長,那麼可以考慮額外寫一段替換代碼,使得每次傳遞參數是一個字元,而不是只寫一行代碼接受數組作為查詢和替換的參數。

13、使用選擇分支語句(譯註:即switch case)好於使用多個if,else if語句。

14、用@屏蔽錯誤消息的做法非常低效,極其低效。

15、打開apache的mod_deflate模塊,可以提高網頁的瀏覽速度。

16、資料庫連接當使用完畢時應關掉,不要用長連接。

17、錯誤消息代價昂貴。

18、在方法中遞增局部變數,速度是最快的。幾乎與在函數中調用局部變數的速度相當。

19、遞增一個全局變數要比遞增一個局部變數慢2倍。

20、遞增一個對象屬性(如:$this->prop++)要比遞增一個局部變數慢3倍。
二、MYSQL數據提高執行效率的要點

1. 為查詢緩存優化你的查詢

大多數的MySQL伺服器都開啟了查詢緩存。這是提高性最有效的方法之一,而且這是被MySQL的資料庫引擎處理的。當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到一個緩存中,這樣,後續的相同的查詢就不用操作表而直接訪問緩存結果了。

這里最主要的問題是,對於程序員來說,這個事情是很容易被忽略的。因為,我們某些查詢語句會讓MySQL不使用緩存。請看下面的示例:

// 查詢緩存不開啟 $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");

// 開啟查詢緩存 $today = date("Y-m-d");
$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");

上面兩條SQL語句的差別就是 CURDATE() ,MySQL的查詢緩存對這個函數不起作用。所以,像 NOW() 和 RAND() 或是其它的諸如此類的SQL函數都不會開啟查詢緩存,因為這些函數的返回是會不定的易變的。所以,你所需要的就是用一個變數來代替MySQL的函數,從而開啟緩存。


2. EXPLAIN 你的 SELECT 查詢

使用 EXPLAIN 關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫你分析你的查詢語句或是表結構的性能瓶頸。

EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的數據表是如何被搜索和排序的……等等,等等。

挑一個你的SELECT語句(推薦挑選那個最復雜的,有多表聯接的),把關鍵字EXPLAIN加到前面。你可以使用phpmyadmin來做這個事。然後,你會看到一張表格。下面的這個示例中,我們忘記加上了group_id索引,並且有表聯接:

18. 越小的列會越快

對於大多數的資料庫引擎來說,硬碟操作可能是最重大的瓶頸。所以,把你的數據變得緊湊會對這種情況非常有幫助,因為這減少了對硬碟的訪問。

參看 MySQL 的文檔 Storage Requirements 查看所有的數據類型。

如果一個表只會有幾列罷了(比如說字典表,配置表),那麼,我們就沒有理由使用 INT 來做主鍵,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 會更經濟一些。如果你不需要記錄時間,使用 DATE 要比 DATETIME 好得多。

當然,你也需要留夠足夠的擴展空間,不然,你日後來干這個事,你會死的很難看,參看Slashdot的例子(2009年11月06 日),一個簡單的ALTER TABLE語句花了3個多小時,因為裡面有一千六百萬條數據。

19. 選擇正確的存儲引擎

在 MySQL 中有兩個存儲引擎 MyISAM 和 InnoDB,每個引擎都有利有弊。酷殼以前文章《MySQL: InnoDB 還是 MyISAM?》討論和這個事情。

MyISAM 適合於一些需要大量查詢的應用,但其對於有大量寫操作並不是很好。甚至你只是需要update一個欄位,整個表都會被鎖起來,而別的進程,就算是讀進程都無法操作直到讀操作完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。

InnoDB 的趨勢會是一個非常復雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。他是它支持「行鎖」 ,於是在寫操作比較多的時候,會更優秀。並且,他還支持更多的高級應用,比如:事務。

下面是MySQL的手冊

* target=」_blank」MyISAM Storage Engine
* InnoDB Storage Engine

20. 使用一個對象關系映射器(Object Relational Mapper)

使用 ORM (Object Relational Mapper),你能夠獲得可靠的性能增漲。一個ORM可以做的所有事情,也能被手動的編寫出來。但是,這需要一個高級專家。

ORM 的最重要的是「Lazy Loading」,也就是說,只有在需要的去取值的時候才會去真正的去做。但你也需要小心這種機制的副作用,因為這很有可能會因為要去創建很多很多小的查詢反而會降低性能。

ORM 還可以把你的SQL語句打包成一個事務,這會比單獨執行他們快得多得多。

❸ 限制ip地址段訪問的php代碼

<?php
$userip = $_SERVER['REMOTE_ADDR']; //獲得用戶ip
$userips = explode(".", $userip);//把獲得的ip切開成數組

if(($userips[0]<=195 && $userips[0]>=195)&&($userips[1]<=163 && $userips[1]>=163)&&($userips[2]<=079 && $userips[2]>=072)&&($userips[3]<=255 && $userips[3]>=000)){
echo "您的ip不符!";
exit;
}else{
echo "通過驗證!";
}
?>

我的思路就是這樣的
獲得用戶的IP 用"."分割成數組
再將 限制IP斷 分別用"."分割成數組

然後判斷用戶IP是否在這個IP斷內(分別判斷四個元素是否在這個范圍里)
……
下面是藍色理想里找到的一個供你參考
——————————————————
<?php
class IP{ //獲取客戶IP地址
function getIpAdr(&$ ip){
$ ip1=getenv("HTTP_X_FORWARDED_FOR");
$ ip2=getenv("HTTP_CLIENT_IP");
$ ip3=getenv("REMOTE_ADDR");
if($ ip1&&$ ip1!='unknow')
$ ip=$ ip1;
else if($ ip2&&$ ip2!='unknow')
$ ip=$ ip2;
else if($ ip3&&$ ip3!='unknow')
$ ip=$ ip3;
else
$ ip='127.0.0.1';
}
}
function get_netip($ myip){ //只留客戶IP地址的前三位
$ temp=explode(".",$ myip);
$ netip.=$ temp[0];
$ netip.=".";
$ netip.=$ temp[1];
$ netip.=".";
$ netip.=$ temp[2];
return $ netip;
}
$ filename="test.ini"; //定義操作文件
$ ip_lib=file($ filename); //讀取文件數據到數組中
$ allow=0;
$ IP=new IP;
$ thisip="";
$ IP->getIpAdr(&$ thisip);
$ thenetip=get_netip($ thisip);

for($ i=0;$ i<count($ ip_lib);$ i++){
if(ereg($ thenetip,$ ip_lib[$ i])){
$ allow=1;
break;
}
}

if ($ allow==1)
{
echo "驗證通過";
}
else {
echo "<script>location.href='Error.php';</script>";
}

?>

❹ PHP如何獲取外網IP地址,類似於百度查詢到的IP,網上的方法,查詢到的都是區域網(內網)的IP,

發一個函數給你.

/**
*獲取客戶端IP地址
*@paraminteger$type返回類型0返回IP地址1返回IPV4地址數字
*@paramboolean$adv是否進行高級模式獲取(有可能被偽裝)
*@returnmixed
*/
functionget_client_ip($type=0,$adv=false){
$type=$type?1:0;
static$ip=NULL;
if($ip!==NULL)return$ip[$type];
if($adv){
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$arr=explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$pos=array_search('unknown',$arr);
if(false!==$pos)unset($arr[$pos]);
$ip=trim($arr[0]);
}elseif(isset($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}elseif(isset($_SERVER['REMOTE_ADDR'])){
$ip=$_SERVER['REMOTE_ADDR'];
}
}elseif(isset($_SERVER['REMOTE_ADDR'])){
$ip=$_SERVER['REMOTE_ADDR'];
}
//IP地址合法驗證
$long=sprintf("%u",ip2long($ip));
$ip=$long?array($ip,$long):array('0.0.0.0',0);
return$ip[$type];
}

如果是本地測試的話,獲取到的是127.0.0.1

❺ php如何將ip點分十進制轉換成16進制

$ip='192.168.0.1';
$long=ip2long($ip);
echo$hex=dechex($long);

❻ 如何向PHP偽造自己的ip

要看具體代碼是怎麼寫的,如果代碼寫得不好是有可能偽造的。
獲取IP的方法有幾種,通過例子看一下,這個是ThinkPHP里的獲取IP的函數:
/**
* 獲取客戶端IP地址
* @param integer $type 返回類型 0 返回IP地址 1 返回IPV4地址數字
* @param boolean $adv 是否進行高級模式獲取(有可能被偽裝)
* @return mixed
*/
function get_client_ip($type = 0,$adv=false) {
$type = $type ? 1 : 0;
static $ip = NULL;
if ($ip !== NULL) return $ip[$type];
if($adv){
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown',$arr);
if(false !== $pos) unset($arr[$pos]);
$ip = trim($arr[0]);
}elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
}elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
// IP地址合法驗證
$long = sprintf("%u",ip2long($ip));
$ip = $long ? array($ip, $long) : array('0.0.0.0', 0);
return $ip[$type];
}

$_SERVER['HTTP_CLIENT_IP'] 是HTTP信息中的IP,存在於http請求的header中,可以偽造;
$_SERVER["REMOTE_ADDR"] 可取得客戶端的 IP 地址,但如果客戶端是使用代理伺服器來訪問,那取到的就是代理伺服器的 IP 地址,而不是真正的客戶端 IP 地址。不可以偽造,但可以用代理。
$_SERVER["HTTP_X_FORWARDED_FOR"] 可以透過代理伺服器取得客戶端的真實 IP 地址,但有時候也不管用,也可以偽造。

熱點內容
反編譯封掛 發布:2024-05-17 06:17:42 瀏覽:820
台電怎麼從電腦轉至安卓 發布:2024-05-17 06:07:23 瀏覽:436
我的世界國際版伺服器里如何開掛 發布:2024-05-17 06:06:05 瀏覽:873
如何同步各個伺服器時間 發布:2024-05-17 06:00:19 瀏覽:714
上課用平板是什麼配置 發布:2024-05-17 05:29:51 瀏覽:565
linux指定組 發布:2024-05-17 05:04:39 瀏覽:86
魯班演算法 發布:2024-05-17 04:59:46 瀏覽:489
分布鋼筋配置有哪些 發布:2024-05-17 04:51:57 瀏覽:148
軒逸寶來朗逸配置一樣哪個平易 發布:2024-05-17 04:48:59 瀏覽:433
c盤刪除緩存文件對系統有影響嗎 發布:2024-05-17 04:27:47 瀏覽:340