Передающее соединение с базой данных ссылкой в PHP

Использование

#df=df.sort_values('Value')
g=df.groupby('Influencer')
pd.concat([g.head(2),g.tail(2)]).sort_index()
Out[693]: 
   Unit Influencer  Value
0     A        foo    321
1     B        foo    200
3     D        foo     12
4     E        foo      3
5     A        bar    999
6     B        bar    209
9     E        bar     15
10    F        bar      2
11
задан Darryl Hein 28 October 2008 в 04:25
поделиться

7 ответов

Ресурс PHP является специальным типом, который уже является ссылкой сам по себе. Передача его значением или явно ссылкой не будет иметь значения (т.е., это - все еще ссылка). Можно проверить это на себя под PHP4:

function get_connection() {
  $test = mysql_connect('localhost', 'user', 'password');
  mysql_select_db('db');
  return $test;
}

$conn1 = get_connection();
$conn2 = get_connection(); // "copied" resource under PHP4

$query = "INSERT INTO test_table (id, field) VALUES ('', 'test')";
mysql_query($query, $conn1);
print mysql_insert_id($conn1)."<br />"; // prints 1

mysql_query($query, $conn2);
print mysql_insert_id($conn2)."<br />"; // prints 2

print mysql_insert_id($conn1); // prints 2, would print 1 if this was not a reference
16
ответ дан 3 December 2019 в 03:37
поделиться

Это не скорость, которую Вы должны быть обеспокоены в, но память.

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

BTW, одноэлементные методы для создания дескрипторов базы данных являются хорошей идеей: можно сделать $db = & Database::Connection(); и всегда получайте корректный дескриптор. Это сохраняет Вас от использования глобального, и статический метод может сделать дополнительное волшебство (как открытие его автоматически) для Вас. Просто остерегайтесь того, когда Ваше приложение масштабируется достаточно, что требуется несколько баз данных: затем Ваша волшебная функция должна будет знать, как вручить Вам назад корректный. IME это не чрезвычайно трудно; основной способ решить, который является для слоя кода, для которого нужен дескриптор DB, чтобы знать, как попросить корректного.

5
ответ дан 3 December 2019 в 03:37
поделиться

Соединение с базой данных на самом деле не содержит базовые значения, таким образом, Вы не должны волноваться о проигрывающих присвоениях, сделанных в функции. Метафорически, можно думать о соединении с БД как, скажем, число взлетно-посадочной полосы - "Хорошо, соединение с БД 12 очищено, чтобы использоваться для запроса" - запрос и набор результатов используют соединение и, возможно, нуждаются в эксклюзивном доступе некоторое время, но соединение ничего не знает о базовых данных.

1
ответ дан 3 December 2019 в 03:37
поделиться

Передача ссылкой времени вызова обесценивается, таким образом, я не использовал бы метод, сначала описанный. Кроме того, вообще говоря, ресурсы передаются ссылкой в PHP 5 по умолчанию. Так наличие любых ссылок не должно требоваться, и Вы никогда не должны открывать больше чем одно соединение с базой данных, если Вам действительно не нужно оно.

Лично, я использую класс одноэлементной фабрики для своих соединений с базой данных, и каждый раз, когда мне нужна ссылка на базу данных, я просто называю Фабрику:: база данных (), тот путь я не должен волноваться о ссылках передачи/получения или многочисленных связях.

<?php
Class Factory
{
  private static $local_db;

/**
* Open new local database connection
*
* @return MySql
*/
public static function localDatabase() {
    if (!is_a(self::$local_db, "MySql")) {
        self::$local_db = new MySql(false);
        self::$local_db->connect(DB_HOST, DB_USER, DB_PASS, DB_DATABASE);
        self::$local_db->debugging = DEBUG;
    }
    return self::$local_db;
}
}
?>
4
ответ дан 3 December 2019 в 03:37
поделиться

Несколько человек сказали, что Вы не должны волноваться об этом для PHP 5. Это неправильно, если у Вас есть объект базы данных, который Вы используете для всего доступа. В этом случае действительно необходимо передать ссылкой, иначе она инстанцирует нового объекта DB, который (часто) создает новое соединение с базой данных.

Я обнаружил это использование XDebug & WinCacheGrind, который доброжелательные шоу все деструкторы, которые называют - в моем случае, полдюжины или больше объекты базы данных.

Разъясниться: причина я указываю на это, состоит в том, что это - распространенный способ использовать Соединения с базой данных вместо ресурса необработанного соединения.

1
ответ дан 3 December 2019 в 03:37
поделиться

Вообще говоря, ссылки не быстрее в PHP. Это - распространенное заблуждение, потому что они семантически подобны указателям C, таким образом, люди, знакомые с C часто, предполагают, что они работают тот же путь. Не так. На самом деле ссылки являются крошечным битом медленнее, чем копии, если Вы на самом деле не присваиваете переменной (Который в любом случае является плохим стилем, если переменная не является объектом).

PHP имеет механизм, названный копией на записи, что означает, что переменная на самом деле не копируется, прежде чем это должно будет. Можно передать огромную структуру данных функции; пока это просто читает из него, это не имеет никакого значения. Ссылка однако, нуждается в дополнительной записи во внутренних регистрах, таким образом, на самом деле потребовалась бы некоторая дополнительная обработка (Хотя едва примечательный).

0
ответ дан 3 December 2019 в 03:37
поделиться

у меня действительно нет определенного ответа для php, но в целом мне казалось бы, что Вы захотите передать это ссылкой, если Вы не будете явно уверены, что встречаетесь с проблемами производительности при передаче значением.

0
ответ дан 3 December 2019 в 03:37
поделиться
Другие вопросы по тегам:

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