Skip to content

Instantly share code, notes, and snippets.

@KEINOS
Last active December 25, 2018 04:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KEINOS/c960b5344bfbb9c14553c06c26201f20 to your computer and use it in GitHub Desktop.
Save KEINOS/c960b5344bfbb9c14553c06c26201f20 to your computer and use it in GitHub Desktop.
macOS の PHP で空きポートを取得する(ランダムな未使用ポート検索) ref: https://qiita.com/KEINOS/items/be7b769f64d5f154388f
lsof -i -P | grep -i 'tcp' | sed 's/\[.*\]/IP/' \
| sed 's/:/ /' | sed 's/->/ /'| awk -F' ' '{print $10}' \
| awk '!a[$0]++'
lsof -i -P | grep -i 'listen' 2>&1
#!/usr/bin/env php
<?php
$browser_default = 'safari';
$browser = isset($argv[1]) ? strtolower($argv[1]) : $browser_default;
switch($browser){
case 'chrome':
$browser = 'Google Chrome';
break;
case 'firefox':
$browser = 'Firefox';
break;
case 'opera':
$browser = 'Opera';
break;
default:
$browser = 'Safari';
break;
}
$port = getPortRandom();
$cmd = "open -a \"{$browser}\" \"http://localhost:{$port}\" ";
$cmd .= "&& php -S localhost:{$port}";
`$cmd`;
/* [Functions] -------------------------------------------------------------- */
function getPortRandom($port_min = 50000, $port_max = 65535)
{
$cmd = 'lsof -i -P | grep -i "listen" 2>&1';
$rows = array_filter(explode(PHP_EOL, `$cmd`));
$ports = array_map(
function ($row) {
$row = str_replace(':', ' ', $row);
$cols = explode(' ', $row);
$cols = array_values(array_filter($cols));
return (int) $cols[9];
},
$rows
);
while (true) {
$port = rand($port_min, $port_max);
if (false === array_search($port, $ports)) {
break;
}
}
return $port;
}
$ cd /path/to/your/dev/dir
$ ls
index.php
$ dev opera
$ cd /path/to/your/dev/dir
$ ls
index.php
$ dev opera
$ cd /path/to/your/dev/dir
$ ls
index.php
$ dev opera
function getPortRandom($port_min = 50000, $port_max = 65535)
{
$cmd = "lsof -i -P | grep -i 'tcp' | sed 's/\[.*\]/IP/' \
| sed 's/:/ /' | sed 's/->/ /'| awk -F' ' '{print $10}' \
| awk '!a[$0]++'";
$ports = array_filter(explode(PHP_EOL, `$cmd`));
while (true) {
$port = rand($port_min, $port_max);
if (false === array_search($port, $ports)) {
break;
}
}
return $port;
}
function getPortRandom($port_min = 50000, $port_max = 65535)
{
$cmd = "lsof -i -P | grep -i 'tcp' | sed 's/\[.*\]/IP/' \
| sed 's/:/ /' | sed 's/->/ /'| awk -F' ' '{print $10}' \
| awk '!a[$0]++'";
$ports = array_filter(explode(PHP_EOL, `$cmd`));
while (true) {
$port = rand($port_min, $port_max);
if (false === array_search($port, $ports)) {
break;
}
}
return $port;
}
function getPortRandom()
{
$socket = socket_create_listen(0); //ランダムな空きポートの割り当て
socket_getsockname($socket, $addr, $port); //ポート情報の取得
socket_close($socket); //ソケットを解放
return (int) $port; //解放されたソケットのポート番号を横取り
}
$ php -a
Interactive shell
php > $sock = socket_create_listen(0);
php > socket_getsockname($sock, $addr, $port);
php > socket_close($sock);
php > echo $port;
58487
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment