Вот еще один неинтуитивный способ. Красота - вы можете циклически перебирать несколько значений, а не только две [0,1]
Для двух значений (переключение)
>>> x=[1,0]
>>> toggle=x[toggle]
Для нескольких значений (скажем, 4)
>>> x=[1,2,3,0]
>>> toggle=x[toggle]
Я не ожидал, что это решение будет почти самым быстрым
>>> stmt1="""
toggle=0
for i in xrange(0,100):
toggle = 1 if toggle == 0 else 0
"""
>>> stmt2="""
x=[1,0]
toggle=0
for i in xrange(0,100):
toggle=x[toggle]
"""
>>> t1=timeit.Timer(stmt=stmt1)
>>> t2=timeit.Timer(stmt=stmt2)
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=100000)/100000)
7.07 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=100000)/100000)
6.19 usec/pass
stmt3="""
toggle = False
for i in xrange(0,100):
toggle = (not toggle) & 1
"""
>>> t3=timeit.Timer(stmt=stmt3)
>>> print "%.2f usec/pass" % (1000000 * t3.timeit(number=100000)/100000)
9.84 usec/pass
>>> stmt4="""
x=0
for i in xrange(0,100):
x=x-1
"""
>>> t4=timeit.Timer(stmt=stmt4)
>>> print "%.2f usec/pass" % (1000000 * t4.timeit(number=100000)/100000)
6.32 usec/pass
Используйте этот класс (https://github.com/BlakeGardner/php-mac-address)
Это класс PHP для обработки MAC-адресов поверх Unix , Linux и Mac OS X. это было написано в первую очередь, чтобы помочь с подделкой для проверок беспроводной безопасности.
Вы можете сделать это легко, используя openWRT. Если вы используете скрытый портал, вы можете смешивать php и openWRT и устанавливать связь между IP и маком.
Вы можете написать простой PHP-код, используя:
$localIP = getHostByName(getHostName());
Позже , используя openWRT, вы можете перейти к /tmp/dhcp.leases
, вы получите что-то с формой:
e4:a7:a0:29:xx:xx 10.239.3.XXX DESKTOP-XXX
Там у вас есть mac, IP-адрес и имя хоста.
Вы можете использовать следующее решение для решения своей проблемы:
$mac='UNKNOWN';
foreach(explode("\n",str_replace(' ','',trim(`getmac`,"\n"))) as $i)
if(strpos($i,'Tcpip')>-1){$mac=substr($i,0,17);break;}
echo $mac;
MAC-адрес клиента (в смысле компьютера, выдавшего HTTP-запрос) перезаписывается каждым маршрутизатором между клиентом и сервером.
Клиентский IP-адрес обычно предоставляется сценарию в $_SERVER['REMOTE_ADDR']
. В некоторых сценариях, особенно если ваш веб-сервер находится за прокси-сервером (т. Е. Прокси-сервер кэширования), $_SERVER['REMOTE ADDR']
вернет IP-адрес прокси-сервера , и будет добавлено дополнительное значение, часто $_SERVER['HTTP_X_FORWARDED_FOR']
, который содержит IP исходного клиента запроса.
Иногда, особенно когда вы имеете дело с анонимным прокси, который вы не контролируете, прокси не вернет реальный IP-адрес, и все, на что вы можете надеяться, это IP-адрес прокси-сервера .
В окнах, если пользователь использует ваш скрипт локально, это будет очень просто:
<?php
// get all the informations about the client's network
$ipconfig = shell_exec ("ipconfig/all"));
// display those informations
echo $ipconfig;
/*
look for the value of "physical adress" and use substr() function to
retrieve the adress from this long string.
here in my case i'm using a french cmd.
you can change the numbers according adress mac position in the string.
*/
echo substr(shell_exec ("ipconfig/all"),1821,18);
?>
Вы можете получить MAC-адрес или физический адрес с помощью этого кода
$d = explode('Physical Address. . . . . . . . .',shell_exec ("ipconfig/all"));
$d1 = explode(':',$d[1]);
$d2 = explode(' ',$d1[1]);
return $d2[1];
Я использовал много раз, потому что shell_exec («ipconfig / all») возвращает полную информацию о всей сети. поэтому вам нужно разделить по одному. при запуске этого кода вы получите свой MAC-адрес 00 - ## - ## - CV-12 // это поддельный адрес только для показа.
Вы можете получить IP-адрес сервера с $_SERVER['SERVER_ADDR']
.
Для MAC-адреса вы можете анализировать вывод netstat -ie
в Linux или ipconfig /all
в Windows.
Вы можете получить IP-адрес клиента с $_SERVER['REMOTE_ADDR']
MAC-адрес клиента не будет доступен вам, за исключением одного особого обстоятельства : , если клиент находится в том же сегменте Ethernet, что и сервер.
Итак, если вы создаете какую-либо систему на базе локальной сети и ваши клиенты , это в том же сегменте Ethernet, тогда вы можете получить MAC-адрес, проанализировав вывод arp -n
(linux) или arp -a
(окна).
Редактирование: вы спрашиваете в комментариях, как получить вывод внешней команды - одним из способов является использование обратных ссылок, например
$ipAddress=$_SERVER['REMOTE_ADDR'];
$macAddr=false;
#run the external command, break output into lines
$arp=`arp -a $ipAddress`;
$lines=explode("\n", $arp);
#look for the output line describing our IP address
foreach($lines as $line)
{
$cols=preg_split('/\s+/', trim($line));
if ($cols[0]==$ipAddress)
{
$macAddr=$cols[1];
}
}
Ну, вам не повезло, если вы не можете заставить клиента добровольно передавать эту информацию и передавать другим способом.
Я не думаю, что вы можете получить MAC-адрес в PHP, но вы можете получить IP из переменной $_SERVER['REMOTE_ADDR']
.
Все, что вам нужно сделать, это поместить arp в другую группу.
По умолчанию:
-rwxr-xr-x 1 root root 48K 2008-11-11 18:11 /usr/sbin/arp*
С командой:
sudo chown root:www-data /usr/sbin/arp
вы будете get:
-rwxr-xr-x 1 root www-data 48K 2008-11-11 18:11 /usr/sbin/arp*
И поскольку apache - это демон, запущенный под пользовательскими www-данными, теперь он может выполнить эту команду.
Итак, если теперь вы используете скрипт PHP, например:
<?php
$mac = system('arp -an');
echo $mac;
?>
вы получите вывод команды linux arp -an
.