session.cookie_domain не работает должным образом в приложении Plesk / PHP на 2 поддоменах

Благодаря всем вышеперечисленным ответам, unsafeBitCast также хорошо работает с Xcode 8.3.2 / Swift 3 / macOS / Cocoa Application.

Запомните адрес текущего экземпляра

(lldb) p tabView.controlTint
(NSControlTint) $R10 = defaultControlTint

(lldb) p self
(LearningStoryboard.NSTabViewController) $R11 = 0x00006080000e2280 {
.....

Позже рассмотрите их

(lldb) p unsafeBitCast(0x00006080000e2280, to: NSTabViewController.self).tabView.controlTint
(NSControlTint) $R20 = graphiteControlTint

(lldb) p $R11.tabView.controlTint
(NSControlTint) $R21 = graphiteControlTint

Если что-то подобное произойдет

(lldb) p unsafeBitCast(0x00006080000e2280, to: NSTabViewController.self).tabView.controlTint
error: use of undeclared identifier 'to'

(lldb) p $R11.tabView.controlTint 
error: use of undeclared identifier '$R11'

, убедитесь, что выберите один из стековых кадров исходного кода Swift а не ассемблер.

Вероятно, это произойдет, когда приложение было приостановлено нажатием кнопки Pause или остановлено с исключением. Выбрав соответствующий кадр стека, пусть lldb выводит правильный язык программирования.

3
задан Andy 29 January 2019 в 09:09
поделиться

2 ответа

Я просто пытаюсь выполнить репликацию:

  • Продукт: Plesk Onyx 17.8.11 Обновление № 37
  • Версия PHP 7.0.32-0ubuntu0.16.04.1
  • [ 115]

    и работает довольно хорошо. Я получил значения в массиве _Session в обоих случаях, даже я просто сохраняю значения только в поддомене.

    В моем наборе «Дополнительные директивы конфигурации» для php.ini одинаковы для домена и субдомена.

0
ответ дан PaulRM 29 January 2019 в 09:09
поделиться

Почему это не работает?

по умолчанию сеансы сохраняются в локальных файлах на сервере, расположение которых указано в php.ini session.save_path, например [ 114], если app.example.com и help.app.example.com работают на 2 разных серверах с их собственной файловой системой, или даже если они работают на одной и той же файловой системе, но имеют разные директивы session.save_path в php.ini, они не будет делить то же самое $ _SESSION.

если вы хотите, чтобы 2 разных сервера использовали один и тот же $ _SESSION, возможные решения включают создание базы данных общего хранилища сеансов с session_set_save_handler() (как вспоминается MongoDB или MySQL) или создание сетевой файловой системы и установки [ 117] в php.ini, но оба эти метода могут повлечь за собой значительное снижение производительности.

... поскольку файл cookie используется в обоих доменах, session_id() будет возвращать одно и то же значение с обеих сторон, которое можно использовать в качестве идентификатора для базы данных сеансов, взгляните на http: // php.net/manual/en/class.sessionhandlerinterface.php

(я бы написал пример класса, если бы у меня было больше времени, но у меня нет времени)

переключиться на хранилище сеансов с поддержкой sql-db (например, MariaDB, MySQL или PostgreSQL), например: schema:

CREATE TABLE sessions (
  id VARCHAR(255) ,
  atime BIGINT ,
  data BLOB
)

Реализация SessionHandlerInterface:

class MySqlSessionHandler implements SessionHandlerInterface
{
    protected $db;
    public function __construct(string $dsn, string $username, string $password)
    {
        $this->db = new PDO($dsn, $username, $password, array(
            PDO::ATTR_EMULATE_PREPARES => false,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ));
    }
    protected function a(string $id) : bool
    {
        $ret = $this->db->query("UPDATE sessions SET atime = " . (time()) . " WHERE id = " . $this->db->quote($id));
        return ($ret->rowCount() > 0);
    }
    public function close() : bool
    {
        // TODO: implement locking/race-condition-free session handling?
        return true;
    }
    public function destroy(string $id) : bool
    {
        $this->db->query("DELETE FROM sessions WHERE id = " . $db->quote($id));
        return true;
    }
    public function gc(int $maxlifetime) : int
    {
        $this->db->query("DELETE FROM sessions WHERE atime < " . (time() - $maxlifetime));
        return 1; // ??? not sure what this return int is supposed to contain, docs doesn't say either
    }
    public function open(string $save_path, string $session_name) : bool
    {
        if (!$this->a($session_name)) {
            $stm = $this->db->prepare("INSERT INTO sessions (id,atime,data) VALUES(?,?,?);");
            $stm->execute(array($session_name, time(), serialize(null)));
        }
        return true;
    }
    public function read(string $session_id) : string
    {
        if (!$this->a($session_id)) {
            throw new \InvalidArgumentException("supplied session id does not exist.");
        }
        return $this->db->query("SELECT data FROM sessions WHERE id = " . $this->db->quote($session_id))->fetch(PDO::FETCH_ASSOC)['data'];
    }
    public function write(string $session_id, string $session_data) : bool
    {
        // optimization note: this function can be optimized to do everything in a single query, instead of using a() (which also use a query)
        if (!$this->a($session_id)) {
            throw new \InvalidArgumentException("supplied session id does not exist.");
        }
        $stm = $this->db->prepare("UPDATE sessions SET data = ? WHERE id = ?");
        $stm->execute(array($session_data, $session_id));
        return true;
    }
}
[ 1119] использование:

// for DSN documentation, check http://php.net/manual/en/ref.pdo-mysql.connection.php
$handler = new MySqlSessionHandler ('mysql:host=mydb.foo.com;dbname=sessions;charset=utf8mb4','MySqlUsername','MySqlPassword');
session_set_save_handler($handler, true);
session_start();
  • теперь они обязательно должны делиться сессиями ..
  • предупреждение: не проверено на момент написания, но это должно работать в теории.
0
ответ дан hanshenrik 29 January 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: