Я использую хитрый способ через PHP Dom Parser
include('simple_html_dom.php');
$html = file_get_html('http://twitter.com/mnckry');
$img = array();
foreach($html->find('img.size73') as $e)
$img[] = $e->src;
foreach($html->find('.profile-header-inner') as $e)
$img[] = str_replace("')", "", str_replace("url('", "", $e->{'data-background-image'}));
echo $img[0];//Avatar
echo "
";
echo end($img);//ProfileBG
. Это даст вам что-то вроде этого; https://pbs.twimg.com/profile_images/378800000487958092/e04a191de329fcf8d000ca03073ad594_bigger.png
, чтобы получить 2 других размера; для большой версии удалите «_bigger», для уменьшенной версии замените «_bigger» на «_normal»
Я думаю, что ваше настоящее решение - не использовать битовые поля в вашей структуре, а вместо этого определить либо заданный тип, либо битовый массив.
тогда вы можете рассмотреть возможность использования сеанса для отдельного пользователя и вместо сохранения login = true в базе данных для отображения их статуса вам или другим пользователям сохранить время последней активности для пользователя. Когда вы открываете свой список онлайн-пользователей, создайте запрос sql, чтобы возвращать только пользователей с last_activity в течение последних 10 минут.ИМХО, лучший способ - сохранять метку времени последней активности в БД при каждом обновлении пользовательской записи. После выхода из системы или тайм-аута (поддерживать тайм-ауты с помощью cronjob) просто установите для него нулевое значение и используйте как флаг.
$user = new User($user_id);
$user->logged_in = (bool)($last_activity > 0);
Иногда вам нужно будет сказать что-то. например "последний раз видели ...", затем оставьте последнее действие и просто добавьте логический флаг (tinyint) logged_in в таблицу пользователей.
This is an extension to what 'ceejayoz' said before.
Let the users periodically ping the service and tell that they are still logged in. Store last ping time in the session. If the last ping session is greater than a said time, then ping again to tell that the use is still alive.
Store the time when you received the ping in the database. If the last ping received is > the keeplive threshold then consider the user has left the site.
The following is some untested sample code for you start with. You can use the "PING__FREQUENCY" to control how often the frequency in which the user activity will update the last_activity column.
define(PING_FREQUENCY,300); //5 mins
if (($_SESSION['lastPingTime'] + PING_FREQUENCE) > time()) {
stillLoggedIn(); //execute a function to tell that the user is still logged in
}
function stillLoggedIn() {
//Do SQL update to mark the last activity time for the user
}
Вам интересно, можете ли вы определить, закрыл ли пользователь свой браузер. Вы можете использовать javascript, но я бы не стал на него полагаться (поскольку javascript легко отключить), но вы не можете этого сделать с PHP, поскольку PHP запускается только тогда, когда вы запрашиваете страницу. Не тогда, когда страница открыта.
В целях безопасности вы должны отслеживать последние действия пользователя, и если они прошли несколько минут (5/10), тогда предположите, что пользователь ушел. Если он что-то сделает снова (например, через 6 минут), то снова в сети.
Насколько я знаю, вы не можете проверить, когда человек закрывает окно браузера (или покидает вашу страницу, чтобы перейти на другую), поэтому вам нужно проверять активность, как было предложено выше.
Хранить метку времени каждой активности пользователя. Когда это время больше 10 минут назад, выполните выход.
В PHP вы можете сделать что-то вроде этого:
session_start();
if (!isset($_SESSION['LAST_ACTIVITY'])) {
// initiate value
$_SESSION['LAST_ACTIVITY'] = time();
}
if (time() - $_SESSION['LAST_ACTIVITY'] > 3600) {
// last activity is more than 10 minutes ago
session_destroy();
} else {
// update last activity timestamp
$_SESSION['LAST_ACTIVITY'] = time();
}
То же самое можно сделать с базой данных. Там вы даже можете получить список пользователей, которые «сейчас» в сети.
Дерево решений напрямую поддерживает этот вид приложений. Деревья решений обычно используются в искусственном интеллекте.
Дерево решений - это двоичное дерево, которое задает «лучший» вопрос на каждой ветви, чтобы различать коллекции, представленные его левыми и правыми дочерними элементами. Лучший вопрос определяется некоторым алгоритмом обучения, который используют создатели приложения «20 вопросов» для построения дерева. Затем, как указывают другие плакаты, дерево глубиной в 20 уровней дает вам миллион вещей.
Простой способ определить «лучший» вопрос в каждой точке - это найти свойство, которое наиболее равномерно делит коллекцию пополам. Таким образом, когда вы получите ответ да / нет на этот вопрос, вы избавитесь примерно от половины коллекции на каждом этапе. Таким образом вы можете приблизить двоичный поиск.
Было бы лучше использовать сеанс для отслеживания статуса входа в систему.
Возможно, лучше сохранить login = true в переменной сеанса чтобы проверить, вошел ли пользователь в систему. Это решит большинство ваших проблем;)
Почему бы вам не использовать для этого сеанс или файлы cookie вместо того, чтобы вставлять их в базу данных. Вы можете установить файлы cookie с помощью функции setcookie () или сделать сеанс доступным и сохранить в нем значение.
Обычно вы помещаете такую информацию в сеансы.
$_SESSION['user'] = "A user name";
Затем, когда вы хотите выйти, вы делаете:
session_destroy();